对esp的几种操作方法

在函数的前3行代码常常是下面这种形式

1、push  ebp

2、mov   ebp,esp

3,sub    esp, 0x0C      // 为函数栈开辟空间

其中1、2行在不保存栈基址的函数中就没有。

看下图中的特殊情况:


add esp, 0xFFFFFF68  也是为函数栈分配空间,只不过换了另外一种形式。

在第二行和第三行之间可能会添加和fs段寄存器与管的指令,如下图

函数开始位置                                   

      

扫描二维码关注公众号,回复: 3489860 查看本文章

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处理是栈顶指针不变化)

这种情况很少遇到,一般也不会对分析造成影响,如果有影响就要手动修改栈指针了。

猜你喜欢

转载自blog.csdn.net/singleyellow/article/details/80958099