我在 C 和 x86 和 x64 汇编中有一个指向 __stdcall 函数的指针,我想做的是有一个 asm 函数,我可以使用它来跳转到该函数。
以windows API函数MessageBoxW为例
void *fn = GetProcAddress(GetModuleHandle("kernel32.dll"), MessageBoxW);
然后在 C 中我将调用 ASM,例如
void foo()
{
MessageBoxW_asmstub(NULL, "test", "test", NULL);
}
假设 fn 是全局的。然后在汇编中我想要一个只转发给 MessageBoxW 的函数,而不是调用它。换句话说,我希望 MessageBoxW 清理传递给 MessageBoxW_asmstub 的变量,然后返回给 foo
jump (fn) ?
我不知道该怎么做。
最佳答案
假设 MessageBoxW_asmstub 向 C 编译器声明为具有正确的调用约定(即 x86 的 __stdcall;幸好 x64 只有一个调用约定),那么正如 Ross Ridge 的评论所说,这就像跳转一样简单到目标函数,然后直接返回给调用者。因为你有一个间接引用(即 fn 指的是指向目标的指针),你可能需要另一个加载指令(虽然我对 x86 的了解在这里有限 - 如果有一些双重间接我不会感到惊讶jmp 的形式)。您可以在调用约定中使用任何 volatile 寄存器来执行此操作,例如对于 x64,您可能会使用以下内容:
extern fn:qword
MessageBoxW_asmstub:
mov rax, fn
jmp rax
顺便说一句,如果您使用调试器逐步调用延迟加载的 DLL 导入,您可能会在链接器生成的 stub 函数中看到类似的模式。
关于c - MASM 和 C 跳转到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32022250/