|
目标程序是一个ZProtect 1.4 企业版加壳的程序。
1.到OEP去
对于这个版本来说,单纯的是ESP定律不再适用,什么意思呢?如果仅仅下硬件断点是断不下来的,我们需要一种[url=http://www.52wpe.net]外挂[/url]断点方式、
先单步走,仍然是走到pushad 以后下hr esp。然后Ctrl+G 输入GetModuleHandleA
到这里来7C80B731 > 8BFF mov edi,edi
7C80B733 55 push ebp
7C80B734 8BEC mov ebp,esp
7C80B736 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C80B73A 74 18 je short kernel32.7C80B754<--- 在这里下F2断点.
7C80B73C FF75 08 push dword ptr ss:[ebp+8]
7C80B73F E8 C0290000 call kernel32.7C80E104
7C80B744 85C0 test eax,eax
7C80B746 74 08 je short kernel32.7C80B750
7C80B748 FF70 04 push dword ptr ds:[eax+4]
7C80B74B E8 7D2D0000 call kernel32.GetModuleHandleW
7C80B750 5D pop ebp
复制代码解释一下为什么要这么下.GetModuleHandleA这个函数在壳的运行中是至关重要的,调用的次数非常的频繁,而且即便是过了OEP以后,主程序初始化的时候也会调用这个函数,也就是说,我们即便不能到达OEP,也可能到达OEP附近。所以用这个断点来[url=http://www.52wpe.net]外挂[/url]我们找OEP。
断点下好以后,F9运行,注意看反汇编窗口EIP的位置。数次之后,就会断在下面的代码上:00A70447 ^\E9 5929FFFF jmp 00A62DA5
复制代码这就是ESP定律应该执行到的位置。
然后取消GetModuleHandleA 里面的Int3断点。这点很重要!!!!!!!否则后面在Patch代码修复IAT的时候就会壳的多线程校验检测到。
再走两步就到了这里,这就是OEP,标准的Delphi入口00453D0C 55 push ebp
00453D0D 8BEC mov ebp,esp
00453D0F 83C4 F0 add esp,-10
00453D12 B8 2C3B4500 mov eax,zp_1_4.00453B2C
00453D17 E8 441FFBFF call zp_1_4.00405C60
00453D1C A1 58504500 mov eax,dword ptr ds:[455058]
00453D21 8B00 mov eax,dword ptr ds:[eax]
00453D23 E8 74E3FFFF call zp_1_4.0045209C
00453D28 8B0D 38514500 mov ecx,dword ptr ds:[455138] ; zp_1_4.00456BFC
00453D2E A1 58504500 mov eax,dword ptr ds:[455058]
00453D33 8B00 mov eax,dword ptr ds:[eax]
00453D35 8B15 3C364500 mov edx,dword ptr ds:[45363C] ; zp_1_4.00453688
00453D3B E8 74E3FFFF call zp_1_4.004520B4
00453D40 A1 58504500 mov eax,dword ptr ds:[455058]
00453D45 8B00 mov eax,dword ptr ds:[eax]
00453D47 E8 E8E3FFFF call zp_1_4.00452134
00453D4C E8 0B00FBFF call zp_1_4.00403D5C
复制代码上面是比较中规中矩的方法,下面介绍一种比较取巧的方法。
直接在OD中运行程序。然后到00401000去,分析一下代码。 |
|