首页 > 解决方案 > 确定函数参数起始地址

问题描述

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

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

par1 的长度已定义。

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

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

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

标签: cassemblyx86nasm

解决方案


根据 x86 ABI,调用者以相反的顺序推送参数,然后调用fun. 该call指令eip在跳转到fun. 然后,您设置堆栈帧,使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 

推荐阅读