c++ - 如何在 x86 程序集中调用函数并向其传递参数

标签 c++ c function assembly x86

英特尔CPU Windows 10 64 位 C++ x86 汇编

我有两个程序,都是我用 C++ 编写的。为了简单起见,我将它们称为程序 A 和程序 B。它们实际上并没有做任何特别的事情,我只是用它们来测试东西并在这个过程中获得一些乐趣。

其想法是,程序 A 将代码注入(inject)到程序 B 中,注入(inject)的代码将设置程序 B 中函数的参数,并调用程序 B 中的函数。

我必须说我从这次实验中学到了很多东西。由于我需要打开具有适当权限的进程的句柄,然后构造要注入(inject)的汇编代码,因此使用 CreateRemoteThread 调用它并随后进行清理。

我已经设法做到这一点,并从程序 B 中调用一个函数,该函数采用一个 UINT64 类型的参数。

我通过注入(inject)以下汇编代码来做到这一点:

b9 paramAddr
e8 funcAddr
c3

通过在程序 B 中使用 CreateRemoteThread 从程序 A 调用此代码片段,我设法在某个地址处调用一个函数并传递一个参数。这很好用。没什么太复杂的,只需调用一个带有一个参数的函数即可。这里需要注意的一点是,我在这段代码之前注入(inject)了参数,只是向 b9 提供了一个参数地址。

现在我无法做的是从程序 A 调用程序 B 中带有两个参数的函数。

函数示例: myFunction(uint num1, int num2)

注入(inject)的过程是相同的,所有工作都很好,Windows API 提供了大量有据可查的功能。

我无法做到的是将两个参数传递给函数。这就是我的麻烦开始的地方。我一直在研究 x86 汇编函数调用约定。他们所做的要么只是

push param2
push param1
call functAddr
retn

执行 mov 到 esi

任何人都可以澄清、解释并提供一个清晰的示例,说明如何在 x86 程序集中调用带有两个参数或类型为 uint 和 int 的函数。

感谢大家付出的时间和精力。

最佳答案

由于您正在寻找一种方法来理解和澄清内部发生的情况,因此我建议您首先为您正在使用的特定机器生成汇编程序文件。如果您使用 gcc 或 g++,则可以使用 -S 标志生成关联的汇编程序文件。首先,您可以实现一个带有两个参数的函数,并在主函数中调用该函数。使用汇编程序文件,您应该能够很好地了解调用函数之前堆栈的填充方式以及返回值的放置位置。在下一步中,您应该将汇编程序文件中看到的内容与 x86 calling convetion 进行比较.

关于c++ - 如何在 x86 程序集中调用函数并向其传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48549014/

相关文章:

c++ - 获取与先前定义的字符串集匹配的字符串的所有前缀的高效结构

c++ - 未定义模板的隐式实例化

C - 这个语法是关于什么的? <<

c - socket() 函数的内部机制是什么?

传递给函数的 Python 自由字符串

c++ - Netbeans C++ 应用程序无法构建

c++ - 动态添加控件到 wxWidgets 对话框

c - C语言如何将变量的值存储在文件中

python - Tkinter 按钮命令函数不执行其任务

javascript - 基于 .pathname 运行函数