反汇编分析函数传参,调用,执行过程中堆栈变化。
eip保存的是将要执行的下条指令的地址
esp 栈顶指针 保存栈顶地址
ebp 栈底指针 保存栈底地址
push 2 :
sub esp,4
mov dword ptr ss:[esp],2
执行完call 指令后有三处变化,说明我们上述分析没有错误。
push ebp :可替换为如下代码
sub esp,4
mov dword ptr ss:[esp],ebp //ebp的值为0019FF30
将esp的值赋给ebp提升栈底
上图是我们自己的推断,我们在看看调试其中和我们的是否一致
发觉一致,说明我们推断正确
REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令
STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元
并且根据标志寄存器中DF位来判断执行完一次stos指令是应该递增还是递减
若DF位为0,则递增,DF位为1,则递减
递增或者递减多少字节由数据宽度来确定,若将eax的值存储到[edi]则递增四个字节
上面三条指令实现的功能是:用CCCCCCCCC将缓冲区填充,防止缓冲区溢出
pop edi :
mov edi,dword ptr ss:[esp]
add esp,4
pop ebp
mov ebp,dword ptr ss:[esp]
add esp,4
我们发觉,函数调用完成后,esp与原来未执行esp的值不相等
调用后
为了平衡堆栈 ,执行add esp,8
执行后堆栈恢复平衡
到此,整个函数的调用过程分析完毕
总结:
该函数实现的功能为:
mov eax,dword ptr ss:[ebp+0x8]
add eax,dword ptr ss:[ebp+0xC]
可以修改为c代码
int fun(int a,int b){
return a+b;
}
若a等于1,b=2;
则为1+2
函数参数入栈顺序:从右到左