确定函数参数起始地址

Determine function argument starting adresses

我有一个 "c" 程序,它为外部 x86 函数提供以下参数:

extern "C" int fun(unsigned char *par1, unsigned char *par2, unsigned int par3);

par1 的长度已定义。

如何确定参数开始的地址?

我知道 par1 从 [ebp+8] 开始,例如par2 从 [ebp+16]

开始

我不知道如何确定 par3 从哪里开始?

调用者根据 x86 ABI 以相反的顺序推送参数,然后调用 funcall 指令在跳转到 fun 之前将 eip 压入堆栈。然后,设置堆栈帧,使 ebp 成为堆栈的顶部,因此 arg1 必须距堆栈帧 8 个字节:

      higher mem
+----------+---------+
| arg 3    | 4 bytes | push arg 3
+----------+---------+           (ebp + 16)
| arg 2    | 4 bytes | push arg 2
+----------+---------+           (ebp + 12)
| arg 1    | 4 bytes | push arg 1
+----------+---------+           (ebp + 8)
| ret addr | 4 bytes | call fun
+----------+---------+           (ebp + 4)
| old ebp  | 4 bytes | push ebp; mov ebp, esp
+----------+---------+ <-------- (ebp + 0) STACK FRAME START
       lower mem