[英]MASM and C jump to function
我有一个指向C中的__stdcall函数的指针,在x86和x64程序集中,我想要做的是有一个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)。 您可以在调用约定中使用任何易失性寄存器来执行此操作,例如,对于x64,您可能会使用以下内容:
extern fn:qword
MessageBoxW_asmstub:
mov rax, fn
jmp rax
顺便说一句,如果您使用调试器逐步调用延迟加载的DLL导入,您可能会看到链接器生成的存根函数中使用的类似模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.