- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在使用 microsoft Visual Studio 2010 编译的应用程序中 Hook 一个函数,并从 delphi 2010 dll 启用 __fastcall,但我不熟练如何解决以下问题:
C++ 函数是:
void __fastcall function(int arg1; char* arg2);
我正在尝试类似的事情(使用 uallHook):
var FTextMessage : procedure(Modo: integer; Msg: pchar); register;
procedure onTextMessage(Modo: integer; Msg: pchar); register;
begin
ShowMessage(inttostr(Modo) + ' - ' + string(Msg));
FTextMessage(Modo, Msg);
end;
begin
HookCode(Ptr($574210), @onTextMessage, @FTextMessage);
end.
这会导致调试/崩溃。
所以,我发现:
"Microsoft or GCC[4] __fastcall[5] convention (aka __msfastcall) passes the first two arguments (evaluated left to right) that fit into ECX and EDX. Remaining arguments are pushed onto the stack from right to left."
Borland fastcall Evaluating arguments from left to right, it passes three arguments via EAX, EDX, ECX. Remaining arguments are pushed onto the stack, also left to right.[6] It is the default calling convention of the 32 bit compiler of Embarcadero Delphi, where >it is known as register.
摘自: http://en.wikipedia.org/wiki/X86_calling_conventions
这就是问题所在,borland fastcall 和 microsoft __fastcall 是不同的。
所以我想我需要在 Hook 函数中使用一段汇编代码来对齐寄存器或其他东西,但我还无法弄清楚这一点。
如有任何帮助,我们将不胜感激。
编辑1:大卫·赫弗南的答案部分有效。 (它只在显示消息之前有效)
var FTextMessage : procedure(Modo: integer;Msg: PAnsiChar); register;
procedure onTextMessage(Modo: integer;Msg: PAnsiChar); register;
begin
ShowMessage(inttostr(Modo) + ' - ' + string(Msg));
asm
MOV ECX,Modo
MOV EDX,Msg
JMP FTextMessage
end; // I got a crash trying or without trying to restore the registers before executing the JMP FTextMessage
// FTextMessage(Modo,Msg); // < Also this method doesnt work either, if I call the Original function from here (without executing asm code above) i got a crash too. (this is what i was meaning with "to correct the registers")
end;
procedure onTextMessageWrapper(Modo: Integer;Msg: PAnsiChar); register;
asm
MOV EDX,ECX // < Moving ECX to EDX, I'm able to Access Modo and Msg correctly in onTextMessage procedure.
JMP onTextMessage
end;
begin
HookCode(Ptr($574210), @onTextMessageWrapper, @FTextMessage);
end.
最佳答案
C++ 函数正在 ECX
和 EDX
中传递参数。因此,您只需将它们分别复制到 Delphi 所需的寄存器:EAX
和 EDX
即可。由于第二个参数已经在正确的寄存器中,因此您所需要的就是:
procedure onTextMessage(Modo: Integer; Msg: PAnsiChar); register;
begin
...
end;
procedure onTextMessageWrapper(Modo: Integer; Msg: PAnsiChar); register;
asm
MOV EAX,ECX
JMP onTextMessage
end;
我在两个函数中完成了此操作,以便我可以编写一个纯 asm
函数来进行寄存器交换。我们想要纯 asm
以避免所有前导码。所以,onTextMessageWrapper
是你的钩子(Hook)函数。
另请注意,由于您使用的是 Unicode Delphi,因此您将希望 PAnsiChar
与 char*
匹配。
我所知道的有关调用约定的最佳引用是 Agner Fog 。你会在那里找到所有血淋淋的细节。重要的一点是,在 Windows x86 上,EAX、ECX 和 EDX 寄存器是 volatile 寄存器或暂存寄存器。这意味着被调用者可以修改这些寄存器而无需恢复它们。这就是为什么我修改了上面的EAX并且懒得把它放回去。
关于visual-studio-2010 - 通过注入(inject)的 Delphi dll 启用 __fastcall 来 Hook 在 MSVC++ 上制作的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13703303/
我想知道如何首先检测 Javascript 是否启用/禁用。在此站点上禁用 javascript 表明 stackoverflow 使用了称为标签的东西。 这是标准的做法吗?它适用于所有浏览器吗?它不
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to enable PHP short tags ? Enable short open tags
在 VSTS (Azure DevOps) 上拥有私有(private)存储库我尝试通过将以下内容添加到 .csproj 文件来启用 SourceLink:https://github.com/dot
我创建了一个 wx.Frame(我们称之为 mainFrame)。该框架上包含一个按钮,当单击该按钮时,会创建一个新框架(我们称之为 childFrame)。 我想知道如何在创建 childFrame
当我禁用 WPF 中的控件时,比如说一个菜单项 MenuItem aMenuItem = ... aMenuItem.IsEnabled = false; MenuItem 中的文本仍然处于事件状态,
我想在我的 nginx 服务器上启用 gzip 压缩。 nginx.conf 文件在这里: http { # Enable Gzip server { location ~* \.(?
我正在使用免费的 heroku 附加 PG 备份并遵循这些 instructions .我找到了安装应用程序的命令:heroku addons:add pgbackups:auto-week。但是我想
我想知道脚本是否可以使用某种切换按钮启用/禁用页面上的所有输入元素。 我用谷歌搜索了它,但除了这个之外没有发现任何有用的东西: http://www.codetoad.com/javascript/e
在我的 php 文件中,我想使用 jQuery Datepicker。 当我的文件加载时,我创建了禁用的日期选择器。 然后,当我的 php 文件(它是一个表单)中的一个特殊字段被填充时,我想启用日期选
我有一个按钮,如下所示: RadButton lnkAdd = new RadButton(); lnkAdd.ID = "BtnAdd"; lnkAdd.CommandName = RadGrid.
public static void ToggleTaskManager(string keyValue) { RegistryKey objRegistryK
我正在 Azure 中使用事件网格订阅,该订阅在创建 Blob 时触发。然而,我们有很多文件进入这个 blob,比如说 1000 多个。 如果我发现任何文件有任何错误,我想做的是禁用事件订阅。 最佳答
我的网站上有几个使用 HTML5 contentEditable 属性的 div。目标是让用户能够开始编写日记条目,并将保存按钮从禁用更改为启用。 这是我目前拥有的 HTML: Write
我有一个范围输入,其定义如下: @Html.LabelFor(m => Model.Quality, Resources.CompressionQuality) 和一个下拉菜单: @Html.Lab
我正在尝试创建一个启用/禁用按钮的下拉菜单,并且我正在关注此 example 但它已经有 4 年历史了,而且该功能似乎无法在我的 xhtml 页面上运行。 任何帮助都将被适当 最佳答案 这是一个现场演
我正在 Azure 中使用事件网格订阅,该订阅在创建 Blob 时触发。然而,我们有很多文件进入这个 blob,比如说 1000 多个。 如果我发现任何文件有任何错误,我想做的是禁用事件订阅。 最佳答
我在这里遇到一个非常奇怪的情况:我编写了一个应用程序,除其他外,将连接的代理从打开切换到关闭,反之亦然。通过更改注册表中的值来完成此操作: public void SetUpProxy(string
我需要调整一堆 PVC 的大小。似乎最简单的方法是通过ExpandPersistentVolumes 功能。但是我无法获得配置合作。 ExpandPersistentVolumes feature g
如果我的TextField为空,则应禁用该按钮,并且该按钮的textColor和borderColor应该为灰色。但是,启用按钮后,颜色应为蓝色。 更改textColor很容易: button.Set
您好,我的问题是:我无法从另一个类启用表单的按钮。我的表单类是 public class FileSending { //Function for enabling the button
我是一名优秀的程序员,十分优秀!