繁体   English   中英

MASM和C跳转功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM