今天阅读了Lenus所写的
寻找真正的入口(OEP)--广义ESP定律,在里面发现了一个错误。所以拿出来和大家一起讨论一下。
寻找真正的入口(OEP)--广义ESP定律的网址是:http://www.pediy.com/bbshtml/BBS6/pediy6083.htm
首先,我要声明lenus写的ESP定律很好。我发现的问题,是lenus写的这个帖子里的第一个例子。原文是这样的“
4.广义ESP定律
很多人看完了教程就会问:ESP定律是不是就是0012FFA4,ESP定律的适用范围是不是只能是压缩壳!
我的回答是:NO!
看完了上面你就知道你如果用0012FFA8也是可以的,ESP定律不仅用于压缩壳他也可以用于加密壳!!!
首先,告诉你一条经验也是事实---当PE文件运行开始的时候,也就是进入壳的第一行代码的时候。寄存器的值总是上面的那些值,不信你自己去试试!而当到达OEP后,绝大多的程序都第一句都是压栈!(除了BC编写的程序,BC一般是在下面几句压栈)
现在,根据上面的ESP原理,我们知道多数壳在运行到OEP的时候ESP=0012FFC4。这就是说程序的第一句是对0012FFC0进行写入操作!
最后我们得到了广义的ESP定律,对只要在0012FFC0下,硬件写入断点,我们就能停在OEP的第二句处!!
下面我们来举个例子,就脱壳进阶第一篇吧!
载入OD后,来到这里:
0040D042 N> B8 00D04000 mov eax,Notepad.0040D000 //停在这里
0040D047 68 4C584000 push Notepad.0040584C
0040D04C 64:FF35 00000000 push dword ptr fs:[0] //第一次硬件中断,F9
0040D053 64:8925 00000000 mov dword ptr fs:[0],esp
0040D05A 66:9C pushfw
0040D05C 60 pushad
0040D05D 50 push eax
直接对0012FFC0下硬件写入断点,F9运行。(注意硬件中断)
在0040D04C第一次硬件中断,F9继续!
0040D135 A4 movs byte ptr es:[edi],byte ptr ds:[esi] //访问异常,不管他 shift+F9继续
0040D136 33C9 xor ecx,ecx
0040D138 83FB 00 cmp ebx,0
0040D13B ^ 7E A4 jle short Notepad.0040D0E1
第二次硬件中断。
004058B5 64 db 64 //断在这里
004058B6 89 db 89
004058B7 1D db 1D
004058B8 00 db 00
004058B9 00 db 00
这里也不是,F9继续!
004010CC /. 55 push ebp
004010CD |. 8BEC mov ebp,esp //断在这里,哈哈,到了!(如果发现有花指令,用ctrl+A分析一下就能显示出来)
004010CF |. 83EC 44 sub esp,44
004010D2 |. 56 push esi
快吧!还不过瘾,在来一个例子。
”
到些我所引用的原文结束。我所发现错误,就在引用的这段文字中。我把例子中用到的脱壳进阶第一篇中所用的程序下载下来。之后,我进行了调试,原文中“直接对0012FFC0下硬件写入断点,F9运行。(注意硬件中断)”,我自己调试的时候给12ffc0 下硬件断点,我发现是不行的。我再观察各个寄存器的值
EAX 00000000
ECX 0013FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFD9000
ESP 0013FFC4
EBP 0013FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 0040D042 Notepad.<ModuleEntryPoint>
我认为, 这个断点不应该下在12ffc0上,应该下在13ffc0上。我在13ffc0下了断点,也做了最终的脱壳。程序的壳可以正常脱掉了。那个程序也打算传上去。大家可以查证一下。
我指出这个错误的目地,是为让大家能在这个地方少走一些路,没有别的意思。
到这里可以下载到例子中用到的程序:openworld.ys168.com 如果大家有时间的话可以查证一下,给这个程序脱一下壳试试。
[课程]FART 脱壳王!加量不加价!FART作者讲授!