在函数的前3行代码常常是下面这种形式
1、push ebp
2、mov ebp,esp
3,sub esp, 0x0C // 为函数栈开辟空间
其中1、2行在不保存栈基址的函数中就没有。
看下图中的特殊情况:
add esp, 0xFFFFFF68 也是为函数栈分配空间,只不过换了另外一种形式。
在第二行和第三行之间可能会添加和fs段寄存器与管的指令,如下图
函数开始位置
mov eax,large fs:0 //
push eax // 把fs寄存器值入栈
mov large fs:0,esp // fs寄存器指向栈中的入栈时fs值
在fs之前,还有-1、SHE_404BE0库函数的入栈
函数结束位置
把栈中的fs值放回到fs寄存器中
还有一种情况:
第4行已经分配了栈空间了,第3行的and(不是add哦)是要干嘛?这个操作是怎样影响esp的?
首先esp后四位只可能有四种情况:0、4、8、C
esp值有四种情况
1、XX XX XX X0000 esp值不受影响
2、XX XX XX X0100 esp值减小4
3、XX XX XX X1000 esp值不受影响
4、XX XX XX X1100 esp值减小4
综上所述 add esp,0xFFFFFFF8 可能在栈中分配一个int(4字节)的空间,也可能不分配,栈指针可能变化也可能不变化(IDA处理是栈顶指针不变化)
这种情况很少遇到,一般也不会对分析造成影响,如果有影响就要手动修改栈指针了。