如何在x86程序集中调用函数并将参数传递给它

时间:2018-01-31 18:23:22

标签: c++ c function assembly x86

Intel CPU Windows 10 64位 C ++ x86程序集

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

这个想法是程序A将代码注入程序B,注入的代码将在程序B中设置函数的参数,并将调用程序B中的函数。

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

我设法这样做并从程序B调用一个函数,该函数接受一个类型为UINT64的参数。

我这样做是通过注入以下汇编代码来实现的:

b9 paramAddr
e8 funcAddr
c3

通过在程序B中使用CreateRemoteThread从程序A调用此代码片段,我设法在地址上调用函数并传递参数。这很好用。没有什么太复杂的只是调用一个需要一个参数的函数。这里要注意的一件事是我在此代码之前注入了参数,并且只为b9提供了一个参数地址。

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

功能示例: myFunction(uint num1,int num2)

注入的过程是相同的,只有精细的Windows API才能提供大量有据可查的功能。

我不能接缝的是将两个参数传递给函数。这是我的麻烦开始的地方。我一直在研究x86汇编函数调用约定。而他们所做的只是

push param2
push param1
call functAddr
retn

执行一个到esi的mov

有没有人可以澄清,解释并提供一个明确的例子,说明如何在x86程序集中调用一个带有两个参数或输入uint和int的函数。

谢谢大家的时间和精力。

1 个答案:

答案 0 :(得分:1)

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