c - MASM 和 C 跳转到函数

标签 c assembly masm masm32

我在 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/

相关文章:

python - python中ctypes创建的线程也在GIL下吗?

C 编程抽象 - typedef 外部声明

c - C 中的变量是否类似于汇编中的标签?

assembly - 通过堆栈将参数传递给 MASM 中的过程

assembly - NASM 是纯汇编,而 MASM 是高级汇编?

python - 我试图用 python ctypes 打开一个用 c 编写的 dll 并运行其中的函数,但它是一个字符,而不是字符串

c++ - 在 Visual Studio Code 中设置相对于工作区路径的 c/c++ 项目路径(.json 配置)

c - 如何在使用程序集排序后刷新 C 数组

assembly - bp 寄存器在基于索引的情况下不起作用

assembly - 在程序集问题中将大写字母转换为小写字母