一、学习了一下脱壳
ESP定律脱壳
1、pushad后,对ESP下硬件断点。在OD中选中ESP,右键——数据窗口中跟随。来到数据窗口中,选中几个字节后右键——断点——硬件访问——Dword。
2、F9运行,暂停下来后,用F8单步,注意看popad,过了popad再跳转或返回就是OEP了。
F8单步法
F8单步,碰到向上的跳转直接在下面F4,碰到跑飞的call,下断点,再次运行到这个callF7进入后再F8单步,直到找到OEP
二、破解过程
1、因为程序会突然退出,所以下API断点ExitProcess
2、找到了导致程序退出的地方
004046F4 |. /75 1A |jnz short 00404710
004046F6 |. |833D 24204E00>|cmp dword ptr ds:[0x4E2024],0x0
004046FD |. |74 06 |je short 00404705
004046FF |. |FF15 24204E00 |call dword ptr ds:[0x4E2024]
00404705 |> |A1 00F04D00 |mov eax,dword ptr ds:[0x4DF000]
0040470A |. |50 |push eax ; /ExitCode => 0x0
0040470B |. |E8 44CBFFFF |call <jmp.&kernel32.ExitProcess> ; \ExitProcess
00404710 |> \8B03 |mov eax,dword ptr ds:[ebx]
可是更改跳转后总是程序崩溃。
3、通过看谁调用了上面第2步中的代码,我找到了关键的call和关键跳
004DB9DE . E8 11D3FFFF call 004D8CF4 ; 影响退出的关键call
004DB9E3 . 84C0 test al,al
004DB9E5 . 74 14 je short 004DB9FB ;关键跳
004DB9E7 . 33D2 xor edx,edx
004DB9E9 . 8B83 AC030000 mov eax,dword ptr ds:[ebx+0x3AC]
004DB9EF . E8 24C6FFFF call 004D8018
004DB9F4 . E8 4F8CF2FF call 00404648 ; 第2步中的call
更改关键跳为jmp后还是出错。
4、去看视频
5、第3步中的代码找对了,关键跳修改的也对。就是我没有在修改后程序崩溃的情况下F8单步调试,看看到底是哪里导致的崩溃。原来后面有很多类似的代码,都调用了00404648,把这些代码中的关键跳都修改了就可以了。
把修改后的代码保存出来后运行,发现可以看到程序的主界面了。可是一点击”软件注册“,程序就又被删除了。
这说明还是有暗桩没有处理完。
6、这里作者给出了一种非常考验手速的方法。把修改后的程序载入OD后点击”软件注册“,立马回到OD中按F12,让程序暂停下来。要是慢了话,程序就删除了。我也是试了两回才成功。
断下来后按Alt+F9返回用户代码,F8单步,不久就发现又调用了00404648。那么就找到了另一处暗桩。
把修改保存出来。