0x01---PEid查壳
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095258772-755133173.png)
0x02---分离重定位
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095259177-113701562.png)
此步骤主要是为了关闭随机基址;
0x03---ESP定律法查找OEP
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095259480-2061009427.png)
在第二个retn的位置进入;
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095259763-277273819.png)
进入jmp跳转中;
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095300014-720220082.png)
在这里,我们可以再次使用ESP定律,当然也可以数据窗口跟随图中位置,我们可以看到其在解密IAT,当跑完IAT,释放堆空间后,找到大跳,就是OEP了;
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095300260-1978050149.png)
进入jmp;
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095300468-1520514125.png)
看到76916B15 Kernel32.VirtualFree是在释放用来解密IAT的堆空间,在这之后,单步步过找到jmp大跳就是OEP了;
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095300674-1708765543.png)
成功到达OEP!!!
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095300882-201988300.png)
取消重建输入表,将其dump出来,之后就是修复IAT表,跟其它一样;
![](https://img2018.cnblogs.com/blog/1886020/201912/1886020-20191203095301079-1221358796.png)
成功脱壳;
总结:由于之前脱过ASPack v2.12,当第一次使用ESP定律后的jmp大跳后的pushad,以为这里就是OEP位置,脱壳失败后,再通过对堆空间的查看,发现其在解密IAT表,于是当跟完IAT解密后,经过几次跳转,成功找到OEP,其实使用2次ESP定律能够更快的找到OEP,也就是说,此程序使用ASPack v2.12加了2次壳,简称壳中壳!!!