关于ESP定律:
我刚看了一片手动脱壳教程,上面提到了:ESP定律.偶看了数遍,一头雾水.上面说,每一种编译工具例如 : VC++ , Delphi , Borland , etc.. 在OEP有一个唯一的/相同的PE头 其中的一些是这样的:
Push EBP
MOV Ebp,Esp //观察入口点ESP值的变化规律,一般到这句后 ESP=12ffc0
Add ESP , -010 //F8执行到这句时,ESP=EBP=12ffc0 //利用这个特性我们很容易找到 OEP+1的地址,或加密壳的stolen bytes 的位置。
虽然偶看不懂,但是依法炮制,很快的找到了找到了几个流行壳的OEP,但是也有例外,如下:
脱壳资源:用EZIP 1.0 -> 加壳的win98记事本.
od,载入:
0040D0BE > $ /E9 19320000 JMP Notepad_.004102DC
0040D0C3 . |E9 7C2A0000 JMP Notepad_.0040FB44
040D0C8 $ |E9 19240000 JMP Notepad_.0040F4E6
0040D0CD $ |E9 FF230000 JMP Notepad_.0040F4D1
0040D0D2 . |E9 1E2E0000 JMP Notepad_.0040FEF5
0040D0D7 $ |E9 882E0000 JMP Notepad_.0040FF64
0040D0DC $ |E9 2C250000 JMP Notepad_.0040F60D
0040D0E1 $ |E9 AE150000 JMP Notepad_.0040E694
0040D0E6 $ |E9 772B0000 JMP Notepad_.0040FC62
0040D0EB $ |E9 87020000 JMP Notepad_.0040D377
0040D0F0 $ |E9 702E0000 JMP Notepad_.0040FF65
0040D0F5 |CC INT3
在命令行输入:
dd 12ffc0. 下断.
F9运行,却没有像教程上说的:停在OEP+1的地址.而是:
004102DA CC INT3
004102DB CC INT3
004102DC /> 55 PUSH EBP
//在此处停下.
004102DD |. 8BEC MOV EBP,ESP
004102DF |. 81EC 28040000 SUB ESP,428
004102E5 |. 53 PUSH EBX
004102E6 |. 56 PUSH ESI
还有,有的加壳程序根本不会出现:ESP=12ffc0 或者12ffa0
有的是 ESP=12ffa9
为什么这样呢? 还有,如果可以,能不能给我详细讲解一下为什么当
ESP等于类似的值时,就断定入口在附近呢????
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法