标题:手动脱壳入门第七篇EZIP 1.0
-------------------------------------------------------------------------------------------------------------------------------
时间:2006/8/28 17:12:52
-------------------------------------------------------------------------------------------------------------------------------
内容:
xTiNt |
手动脱壳入门第七篇EZIP 1.0 手动脱壳入门第七篇EZIP 1.0 【脱文标题】 手动脱壳入门第七篇EZIP 1.0 【脱文作者】 weiyi75[Dfcg] 【作者邮箱】 weiyi75@sohu.com 【作者主页】 Dfcg官方大本营 【使用工具】 Peid,Ollydbg,Loadpe,ImportREC 【脱壳平台】 Win2K/XP 【软件名称】 Notepad.exe 【软件简介】 EZIP 1.0 加壳的一个Win98的记事本 【软件大小】 33.8KB 【加壳方式】 EZIP 1.0 -> Jonathan Clark [Overlay] 【保护方式】 EZIP 【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享: 软件截图 本地下载 好现在我们来手动脱一个EZIP1.0加壳的记事本看看它的特性。 本地下载 我们看到加壳后文件大小79.3k,原Win98下的记事本52K,看来这个程序不是已压缩文件大小为目的,只是个简单保护程序不被反汇编的简单加壳程序。 首先必须的工具要准备好 附件中壳为Peid测壳为EZIP 1.0 -> Jonathan Clark [重叠] 手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。 手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。 用OD载入程序后。 这次没有任何提示,应为这个壳是增肥壳,所以Od无压缩提示。 停在这里 0040D0BE N> $ /E9 19320000 jmp Notepad.004102DC 开始地点,和我们平时看到的Pushad等不同。怎样找Oep呢,只能在程序跨段跳跃时,地址变化很大时寻找Oep,一般通过Jmp,Ret等语句跨段。 0040D0C3 . |E9 7C2A0000 jmp Notepad.0040FB44 0040D0C8 $ |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 如无特别提示,单步跟踪脱壳均用F8键步过。 004102DC /> \55 push ebp 跳到这里。 004102DD |. 8BEC mov ebp, esp 004102DF |. 81EC 28040000 sub esp, 428 004102E5 |. 53 push ebx 004102E6 |. 56 push esi 004102E7 |. 57 push edi 004102E8 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C] 004102EE |. 50 push eax 004102EF |. E8 FCCDFFFF call Notepad.0040D0F0 远程Call用F8过。 004102F4 |. 59 pop ecx 004102F5 |. 85C0 test eax, eax 004102F7 |. 75 05 jnz short Notepad.004102FE 跳 004102F9 |. E9 8C030000 jmp Notepad.0041068A 004102FE |> \68 00800000 push 8000 到这里。 00410303 |. 6A 00 push 0 00410305 |. FF95 DCFCFFFF call dword ptr ss:[ebp-324] ; kernel32.GlobalAlloc 0041030B |. 8985 3CFCFFFF mov dword ptr ss:[ebp-3C4], eax ................................................... 0041033A |. 68 00304100 push Notepad.00413000 ; ASCII "1.1.3" 0041033F |. 8D85 44FCFFFF lea eax, dword ptr ss:[ebp-3BC] 00410345 |. 50 push eax 00410346 |. E8 E7CCFFFF call Notepad.0040D032 远程Call用F8过。 ................................................... 004103C3 |. 8D85 ECFBFFFF lea eax, dword ptr ss:[ebp-414] 004103C9 |. 50 push eax 004103CA |. 8D85 3CFCFFFF lea eax, dword ptr ss:[ebp-3C4] 004103D0 |. 50 push eax 004103D1 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C] 004103D7 |. 50 push eax 004103D8 |. E8 28CCFFFF call Notepad.0040D005 远程Call用F8过。 ................................................... 004103F0 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C] 004103F6 |. 50 push eax 004103F7 |. E8 09CCFFFF call Notepad.0040D005 004103FC |. 83C4 10 add esp, 10 004103FF |. 68 E0000000 push 0E0 00410404 |. 8D85 08FDFFFF lea eax, dword ptr ss:[ebp-2F8] 0041040A |. 50 push eax 0041040B |. 8D85 3CFCFFFF lea eax, dword ptr ss:[ebp-3C4] 00410411 |. 50 push eax 00410412 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C] 00410418 |. 50 push eax 00410419 |. E8 E7CBFFFF call Notepad.0040D005 远程Call用F8过。 ................................................... 0041042B |. /75 0C jnz short Notepad.00410439 小跳转,没什么值得注意。 0041042D |. |0FBE85 EDFBFF>movsx eax, byte ptr ss:[ebp-413] 00410434 |. |83F8 5A cmp eax, 5A 00410437 |. |74 14 je short Notepad.0041044D 00410439 |> |6A 00 push 0 0041043B |. |68 644B4100 push Notepad.00414B64 00410440 |. |68 184A4100 push Notepad.00414A18 ; ASCII "bad Dos Header" 00410445 |. |6A 00 push 0 00410447 |. |FF95 04FDFFFF call dword ptr ss:[ebp-2FC] 0041044D |> \6A 40 push 40 ................................................... 004104BE |. E8 BFCBFFFF call Notepad.0040D082 远程Call用F8过。 004104C3 |. 83C4 0C add esp, 0C 004104C6 |. 8B85 DCFBFFFF mov eax, dword ptr ss:[ebp-424] 004104CC |. 8B8D DCFBFFFF mov ecx, dword ptr ss:[ebp-424] 004104D2 |. 0348 3C add ecx, dword ptr ds:[eax+3C] 004104D5 |. 898D E4FBFFFF mov dword ptr ss:[ebp-41C], ecx 004104DB |. 8B85 E4FBFFFF mov eax, dword ptr ss:[ebp-41C] 004104E1 |. 83C0 18 add eax, 18 004104E4 |. 8985 2CFCFFFF mov dword ptr ss:[ebp-3D4], eax 004104EA |. 8B85 2CFCFFFF mov eax, dword ptr ss:[ebp-3D4] ................................................... 0041050A |. E8 73CBFFFF call Notepad.0040D082 远程Call用F8过。 0041050F |. 83C4 0C add esp, 0C 00410512 |. 68 E0000000 push 0E0 00410517 |. 8D85 08FDFFFF lea eax, dword ptr ss:[ebp-2F8] 0041051D |. 50 push eax 0041051E |. FFB5 2CFCFFFF push dword ptr ss:[ebp-3D4] 00410524 |. E8 59CBFFFF call Notepad.0040D082 远程Call用F8过。 00410529 |. 83C4 0C add esp, 0C 0041052C |. 8B85 E4FBFFFF mov eax, dword ptr ss:[ebp-41C] 00410532 |. 0FB740 06 movzx eax, word ptr ds:[eax+6] ................................................... 0041054E |. E8 B2CAFFFF call Notepad.0040D005 远程Call用F8过。 00410553 |. 83C4 10 add esp, 10 00410556 |. 83A5 34FCFFFF>and dword ptr ss:[ebp-3CC], 0 0041055D |. EB 0D jmp short Notepad.0041056C 跳走。 0041056C |> \8B85 E4FBFFFF mov eax, dword ptr ss:[ebp-41C] ; Notepad.00400080 00410572 |. 0FB740 06 |movzx eax, word ptr ds:[eax+6] 00410576 |. 3985 34FCFFFF |cmp dword ptr ss:[ebp-3CC], eax 0041057C |. 0F83 9D000000 |jnb Notepad.0041061F 看这个跳转很大,估计是循环出口。这里没跳走,因为脱壳的过程是外壳程序程序在内存中解压程序,我们看到的解压过程就是一些循环,解压完毕后就要转到程序入口点,准备运行程序,这个时候就是我们手动脱壳的时机。 ................................................... 004105E0 |. 8B85 ECFDFFFF |mov eax, dword ptr ss:[ebp-214] 004105E6 |. FF70 10 |push dword ptr ds:[eax+10] 004105E9 |. FFB5 D8FBFFFF |push dword ptr ss:[ebp-428] 004105EF |. FFB5 E8FDFFFF |push dword ptr ss:[ebp-218] 004105F5 |. 8D85 3CFCFFFF |lea eax, dword ptr ss:[ebp-3C4] 004105FB |. 50 |push eax 004105FC |. 8D85 94FCFFFF |lea eax, dword ptr ss:[ebp-36C] 00410602 |. 50 |push eax 00410603 |. E8 48CAFFFF |call Notepad.0040D050 00410608 |. 83C4 18 |add esp, 18 0041060B |. 8B85 ECFDFFFF |mov eax, dword ptr ss:[ebp-214] 00410611 |. 83C0 28 |add eax, 28 00410614 |. 8985 ECFDFFFF |mov dword ptr ss:[ebp-214], eax 0041061A |.^ E9 40FFFFFF \jmp Notepad.0041055F 跳到0041055F,直到在内存中解压完毕从0041057C跳出。 我们点一下 0041057C这行,然后回车。 0041057C |. 0F83 9D000000 |jnb Notepad.0041061F 回车 0041061F |> \FFB5 E8FDFFFF push dword ptr ss:[ebp-218] F2在这句下断点,F9执行到这里F2取消断点。 00410625 |. FF95 D4FCFFFF call dword ptr ss:[ebp-32C] ; kernel32.CloseHandle 0041062B |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C] 00410631 |. 50 push eax 00410632 |. 8B85 2CFCFFFF mov eax, dword ptr ss:[ebp-3D4] 00410638 |. 8B8D E0FBFFFF mov ecx, dword ptr ss:[ebp-420] 0041063E |. 2B48 1C sub ecx, dword ptr ds:[eax+1C] 00410641 |. 51 push ecx 00410642 |. FFB5 2CFCFFFF push dword ptr ss:[ebp-3D4] 00410648 |. E8 6CCAFFFF call Notepad.0040D0B9 0041064D |. 83C4 0C add esp, 0C 00410650 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C] 00410656 |. 50 push eax 00410657 |. FFB5 2CFCFFFF push dword ptr ss:[ebp-3D4] ................................................... 00410648 |. E8 6CCAFFFF call Notepad.0040D0B9 远程Call用F8过。 0041064D |. 83C4 0C add esp, 0C 00410650 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C] 00410656 |. 50 push eax 00410657 |. FFB5 2CFCFFFF push dword ptr ss:[ebp-3D4] 0041065D |. E8 F3C9FFFF call Notepad.0040D055 远程Call用F8过。 00410662 |. 59 pop ecx 00410663 |. 59 pop ecx 00410664 |. 8B85 2CFCFFFF mov eax, dword ptr ss:[ebp-3D4] 0041066A |. 8B40 10 mov eax, dword ptr ds:[eax+10] 0041066D |. 8B8D 2CFCFFFF mov ecx, dword ptr ss:[ebp-3D4] 00410673 |. 0341 1C add eax, dword ptr ds:[ecx+1C] 00410676 |. 8985 38FCFFFF mov dword ptr ss:[ebp-3C8], eax 0041067C |. 8B85 38FCFFFF mov eax, dword ptr ss:[ebp-3C8] 00410682 |. 5F pop edi 00410683 |. 5E pop esi 00410684 |. 5B pop ebx 00410685 |. 8BE5 mov esp, ebp 00410687 |. 5D pop ebp 00410688 |.- FFE0 jmp eax ; Notepad.004010CC 呵,解压完毕,准备跳到入口点了。410688和4010CC多么明显的跨段 004010CC 55 push ebp 入口点。注意,因为这个壳会修改PE头,只好用LordPE脱壳。用Od的插件脱壳并修复也不能运行。 Loadpe脱壳时,在进程列表中找到Notepad.exe这个进程,点右键完整脱壳,保存即可。 截图 004010CD 8BEC mov ebp, esp 004010CF 83EC 44 sub esp, 44 004010D2 56 push esi 004010D3 FF15 E4634000 call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA 004010D9 8BF0 mov esi, eax 004010DB 8A00 mov al, byte ptr ds:[eax] 004010DD 3C 22 cmp al, 22 004010DF 75 1B jnz short Notepad.004010FC 004010E1 56 push esi 004010E2 FF15 F4644000 call dword ptr ds:[4064F4] ; USER32.CharNextA 004010E8 8BF0 mov esi, eax 脱壳后的入口点不正确,手动改麻烦,我们用ImportREC这个专业级的工具修复,如果输入表坏的也可一并修复,还可以跨平台运行。 Imprec修复过程。 在Oep处填000010cc,点IT自动搜索,然后点获输入信息,看到输入表全部有效,点修复抓取文件按钮,选择Dump的文件,修复它,正常运行,这里不用备份,Imprec自动帮你做了. "手动脱壳入门第七篇"脱壳动画! |