当程序载入OD之后
004AC460 > $ 60 pushad;程序停在这里 F8 指向pushad指令
pushad是把寄存器中数据入栈 栈中数据如下:
0012FFA4 7C930208 |EDI <-- ESP指向栈顶
0012FFA8 FFFFFFFF |ESI
0012FFAC 0012FFF0 |EBP
0012FFB0 0012FFC4 |ESP
0012FFB4 7FFDE000 |EBX
0012FFB8 7C92E4F4 |EDX
0012FFBC 0012FFB0 |ECX
0012FFC0 00000000 |EAX
此时ESP指向栈顶 地址为0012FFA4 ,脱壳从这里开始-.-~
来到数据段即内存地址0012FFA4 在这下断点 - 硬件访问 - word
然后F9 -- 这里就能找到OEP
那么我的理解就是 汇编指令之前前先把各个寄存器保存起来,然后执行壳的操作比如解压,
等壳的工作完成之后需要恢复各个寄存器的值 ,我们在栈中已经设置了一个断点,所以当程序访问栈中数据(popad,我们在0012FFA4 下断点是EDI的值,当程序恢复EDI寄存器)时就被我们给断了下来 ,当然并不是断在pop EDI指令上,而是断在popad的下一条指令,因为popad是一步到位恢复寄存器的。
然后在寻找OEP,一般是jmp大跳 然后就看到了期待已久的55机器码了 dump之-.-~
可以理解为壳的执行是一个子程序 ,子程序运行前都要保持寄存器,完事之后恢复寄存器,返回主程序
我们在恢复寄存器的地方下断点,然后 ...
以上就是我对ESP定律的理解,虽然还未成功脱的一壳,但是各大网站论坛都在谈论ESP之威武,据说可脱所以压缩壳,所以大概找了些文章看看,ESP定律就是利用堆栈平衡找到程序结束继而找到OEP。
以上为个人理解,为了不误人子弟,有错误大神请指出
popad:相当于
push EAX
push ECX
push EDX
push EBX
push ESP
push EBP
push ESI
push EDI