首页
社区
课程
招聘
[原创]Unpacking ExeShield Protector
发表于: 2008-1-7 16:50 5482

[原创]Unpacking ExeShield Protector

2008-1-7 16:50
5482
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”-->“获取输入表”-->“抓取修复文件”即可!

脱壳修复后的程序运行一切正常!

--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
2
如果要顺利完成这次脱壳之旅,最好先看《Clone ExeShield Protector License Generator》这篇文章。

《Clone ExeShield Protector License Generator》
http://bbs.pediy.com/showthread.php?t=57801
2008-1-7 16:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习。。。         
呵呵
2008-1-7 19:35
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
4
留名  
2008-1-7 20:33
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
5
速度真快!支持啊!
2008-1-7 20:46
0
游客
登录 | 注册 方可回帖
返回
//