Unpacking ExeShield Protector
Writer by KuNgBiM/[CCG]
Email: kungbim@163.com
Date: January 7, 2008
Tools: OllyICE, ImportREC_FIX, LordPE_DLX
【前言】
在上篇《Clone ExeShield Protector License Generator》文章中的前言部分提到的我最开始的目的“脱壳”,但由于中途改变想法,所以未能实现我的最初目的,这次就补上这篇脱壳分析。(目标还是上篇文章中涉及的那个加壳记事本)
分析ExeShield后不难发现,其实它也就是属于一个普通的混血加密壳。内核使用了PECompact和PEBundle保护的套路来保护我们的目标程序,所以要找到程序的OEP并不难,但是想要脱掉ExeShield所保护的程序,我们还需要修改一下它的保护机制及运行流程,才能更好的获取目标程序的IAT,下面我就带领大家一起开始美妙的脱壳旅程。
【分析正文】
OllyICE载入目标程序:
00401000 > B8 D0BB9B00 mov eax,NOTEPAD.009BBBD0 ; EP(PECompact)
00401005 50 push eax
00401006 64:FF35 00000000 push dword ptr fs:[0] ; hr esp // ESP定律
0040100D 64:8925 00000000 mov dword ptr fs:[0],esp
00401014 33C0 xor eax,eax
00401016 8908 mov dword ptr ds:[eax],ecx
00401018 50 push eax
00401019 45 inc ebp
0040101A 43 inc ebx
0040101B 6F outsd
0040101C 6D insd
0040101D 70 61 jo short NOTEPAD.00401080
0040101F 637432 00 arpl word ptr ds:[edx+esi],si
00401023 CE into
硬件断点设置完毕后,Shift+F9运行中断4次后来到Jmp EAX,然后只需F7一次跟进,我们便可以看到PEBundle的EP入口:
009B8000 9C pushfd ; EP(PEBundle)
009B8001 60 pushad
009B8002 E8 02000000 call NOTEPAD.009B8009
009B8007 33C0 xor eax,eax
009B8009 8BC4 mov eax,esp
009B800B 83C0 04 add eax,4
009B800E 93 xchg eax,ebx
009B800F 8BE3 mov esp,ebx
009B8011 8B5B FC mov ebx,dword ptr ds:[ebx-4]
009B8014 81EB 07204000 sub ebx,NOTEPAD.00402007
009B801A 87DD xchg ebp,ebx
009B801C 83BD 3D294000 01 cmp dword ptr ss:[ebp+40293D],1
009B8023 0F84 33040000 je NOTEPAD.009B845C
009B8029 80BD 522F4000 00 cmp byte ptr ss:[ebp+402F52],0
009B8030 74 37 je short NOTEPAD.009B8069
009B8032 8D85 FB2C4000 lea eax,dword ptr ss:[ebp+402CFB]
009B8038 50 push eax
009B8039 FF95 D72C4000 call dword ptr ss:[ebp+402CD7]
009B803F 8D8D 512E4000 lea ecx,dword ptr ss:[ebp+402E51]
Shift+F9继续运行中断2次后到达加密程序的授权模块内,这时我们就可以删除硬件断点了。
0046DE50 55 push ebp ; 授权模块界面EP
0046DE51 8BEC mov ebp,esp
0046DE53 83C4 F4 add esp,-0C
0046DE56 53 push ebx
0046DE57 B8 40DC4600 mov eax,NOTEPAD.0046DC40
0046DE5C E8 6384F9FF call NOTEPAD.004062C4
0046DE61 8B1D 442D4700 mov ebx,dword ptr ds:[472D44] ; NOTEPAD.004737B0
0046DE67 8B03 mov eax,dword ptr ds:[ebx]
0046DE69 E8 3A6FFDFF call NOTEPAD.00444DA8
0046DE6E 8B03 mov eax,dword ptr ds:[ebx]
0046DE70 BA C8DE4600 mov edx,NOTEPAD.0046DEC8
0046DE75 E8 526BFDFF call NOTEPAD.004449CC
0046DE7A 8B0D 742B4700 mov ecx,dword ptr ds:[472B74] ; NOTEPAD.00473AD0
0046DE80 8B03 mov eax,dword ptr ds:[ebx]
0046DE82 8B15 603E4600 mov edx,dword ptr ds:[463E60] ; NOTEPAD.00463EAC
0046DE88 E8 336FFDFF call NOTEPAD.00444DC0
0046DE8D 8B0D B82B4700 mov ecx,dword ptr ds:[472BB8] ; NOTEPAD.00473AB4
0046DE93 8B03 mov eax,dword ptr ds:[ebx]
0046DE95 8B15 1C2F4600 mov edx,dword ptr ds:[462F1C] ; NOTEPAD.00462F68
0046DE9B E8 206FFDFF call NOTEPAD.00444DC0
0046DEA0 8B0D 682E4700 mov ecx,dword ptr ds:[472E68] ; NOTEPAD.00473AC0
0046DEA6 8B03 mov eax,dword ptr ds:[ebx]
0046DEA8 8B15 3C394600 mov edx,dword ptr ds:[46393C] ; NOTEPAD.00463988
bp WriteProcessMemory
7C80220F > 8BFF mov edi,edi ; 中断在此,注意观察调用窗数据变化
7C802211 55 push ebp
7C802212 8BEC mov ebp,esp
7C802214 51 push ecx
7C802215 51 push ecx
7C802216 8B45 0C mov eax,dword ptr ss:[ebp+C]
7C802219 53 push ebx
7C80221A 8B5D 14 mov ebx,dword ptr ss:[ebp+14]
7C80221D 56 push esi
7C80221E 8B35 B812807C mov esi,dword ptr ds:[<&ntdll.NtProtect>; ntdll.ZwProtectVirtualMemory
7C802224 57 push edi
7C802225 8B7D 08 mov edi,dword ptr ss:[ebp+8]
7C802228 8945 F8 mov dword ptr ss:[ebp-8],eax
7C80222B 8D45 14 lea eax,dword ptr ss:[ebp+14]
7C80222E 50 push eax
7C80222F 6A 40 push 40
7C802231 8D45 FC lea eax,dword ptr ss:[ebp-4]
7C802234 50 push eax
7C802235 8D45 F8 lea eax,dword ptr ss:[ebp-8]
7C802238 50 push eax
7C802239 57 push edi
7C80223A 895D FC mov dword ptr ss:[ebp-4],ebx
7C80223D FFD6 call esi
7C80223F 3D 4E0000C0 cmp eax,C000004E
7C802244 74 5C je short kernel32.7C8022A2
7C802246 85C0 test eax,eax
7C802248 7C 4D jl short kernel32.7C802297
---------------------------------【调用窗】----------------------------------
【中断第一次】
0141E194 004689DF /CALL 到 WriteProcessMemory 来自 NOTEPAD.004689DA
0141E198 000000D0 |hProcess = 000000D0 (window)
0141E19C 01001000 |Address = 1001000
0141E1A0 00473AD8 |Buffer = NOTEPAD.00473AD8
0141E1A4 00006518 |BytesToWrite = 6518 (25880.)
0141E1A8 0147FF80 \pBytesWritten = 0147FF80
0141E1AC 0141E1B8 指向下一个 SEH 记录的指针
0141E1B0 00468D80 SE处理程序
【中断第二次】
0012FDC8 00469478 /CALL 到 WriteProcessMemory 来自 NOTEPAD.00469473
0012FDCC 000000D0 |hProcess = 000000D0 (window)
0012FDD0 01006420 |Address = 1006420 ★ 原始程序OEP,Dump时机到了! ★
0012FDD4 00473AD8 |Buffer = NOTEPAD.00473AD8
0012FDD8 00000008 |BytesToWrite = 8
0012FDDC 0012FE04 \pBytesWritten = 0012FE04
0012FDE0 0012FE1C 指向下一个 SEH 记录的指针
0012FDE4 004694B3 SE处理程序
-----------------------------------------------------------------------------
【注意】
程序在WriteProcessMemory函数断点中断第二次后,目标程序被正常打开了,但这时请不要对程序及调试器作任何操作(否则程序OEP代码会被StolenCode一部分字节)
【脱壳及修复】
接上,我们使用LordPE_DLX抓取进程列表中目标程序所对应目录中生成的另一个临时文件进程,我这里是“xshld8150.tmp”,Full Dump!!
然后使用ImportREC_FIX也同样找到进程列表中目标程序所对应目录中生成的另一个临时文件进程,这时我们可以看到OEP也自动被填入了,所以我们可以直接点“自动搜索IAT”-->“获取输入表”-->“抓取修复文件”即可!
脱壳修复后的程序运行一切正常!
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课