确定函数参数起始地址
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 以相反的顺序推送参数,然后调用 fun
。 call
指令在跳转到 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
我有一个 "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 以相反的顺序推送参数,然后调用 fun
。 call
指令在跳转到 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