文章作者:fly
目标页面:
http://bbs.pediy.com/showthread. ... 30&pagenumber=3
软件简介:Morphine is very unique application for PE files encryption.
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg、PEiD、PETools
—————————————————————————————————
【脱壳过程】:
很少注意这个Morphine壳,Morphine只是对Section Table动了手脚,没有加密输入表等。
感觉更像是一个简单的“伪装”壳罢了。看到论坛里这几天有兄弟讨论这个,所以抽点时间看了看。
jingulong没时间写教程,我就来代写一下吧。
脱壳目标用csjwaman上传之Morphine加壳的“PE文件分析器.exe”。
—————————————————————————————————
一、恢复 Section Table
复制内容到剪贴板
代码:
005F125B F8 clc
//进入Ollydbg后暂停在这
005F125C 85C9 test ecx,ecx
005F125E F5 cmc
005F125F 57 push edi
005F1260 74 05 je short PE.005F1267下断:BP VirtualAlloc
中断后取消断点,Alt+F9返回
复制内容到剪贴板
代码:
005F10FD FFD3 call ebx
005F10FF 59 pop ecx
//返回这里
005F1100 85C0 test eax,eax
005F1102 75 13 jnz short PE.005F1117
005F1104 6A 40 push 40
005F1106 68 00100000 push 1000
005F110B 51 push ecx
005F110C 50 push eax
005F110D FFD3 call ebx
005F110F 85C0 test eax,eax
005F1111 0F84 3A010000 je PE.005F1251—————————————————————————
看看寄存器情况:
复制内容到剪贴板
代码:
EAX 00400000
ECX 77E5986B kernel32.77E5986B
EDX 7FFE0304
EBX 77E5980A kernel32.VirtualAlloc
ESP 0012F7A0
EBP 0012FFB0
ESI 005F18FB ASCII "CODE"
EDI 0012FDB8 ASCII "PE"
EIP 005F10FF PE.005F10FF转存005F18FB处看看,这里就是原来的段表信息:
复制内容到剪贴板
代码:
005F18FB 43 4F 44 45 00 00 00 00 90 62 0B 00 00 10 00 00 CODE....恇
005F190B 00 64 0B 00 00 04 00 00 00 00 00 00 00 00 00 00 .d
005F191B 00 00 00 00 60 00 00 E0 44 41 54 41 00 00 00 00 ....`.. DATA....
005F192B 98 22 00 00 00 80 0B 00 00 24 00 00 00 68 0B 00 ?...
005F193B 00 00 00 00 00 00 00 00 00 00 00 00 60 00 00 E0 ............`..?
005F194B 42 53 53 00 00 00 00 00 B5 0C 00 00 00 B0 0B 00 BSS.....?...?.
005F195B 00 00 00 00 00 8C 0B 00 00 00 00 00 00 00 00 00 .....?.........
005F196B 00 00 00 00 60 00 00 E0 2E 69 64 61 74 61 00 00 ....`..?idata..
005F197B 7A 26 00 00 00 C0 0B 00 00 28 00 00 00 8C 0B 00 z&...?..(...?.
005F198B 00 00 00 00 00 00 00 00 00 00 00 00 60 00 00 E0 ............`..?
005F199B 2E 74 6C 73 00 00 00 00 10 00 00 00 00 F0 0B 00 .tls........?.
005F19AB 00 00 00 00 00 B4 0B 00 00 00 00 00 00 00 00 00 .....?.........
005F19BB 00 00 00 00 60 00 00 E0 2E 72 64 61 74 61 00 00 ....`..?rdata..
005F19CB 18 00 00 00 00 00 0C 00 00 02 00 00 00 B4 0B 00 ...........?.
005F19DB 00 00 00 00 00 00 00 00 00 00 00 00 60 00 00 F0 ............`..?
005F19EB 2E 72 65 6C 6F 63 00 00 44 B1 00 00 00 10 0C 00 .reloc..D?....
005F19FB 00 B2 00 00 00 B6 0B 00 00 00 00 00 00 00 00 00 .?..?.........
005F1A0B 00 00 00 00 60 00 00 F0 2E 72 73 72 63 00 00 00 ....`..?rsrc...
005F1A1B 00 14 02 00 00 D0 0C 00 00 14 02 00 00 68 0C 00 ...?....h..
005F1A2B 00 00 00 00 00 00 00 00 00 00 00 00 60 00 00 F0 ............`..?
005F1A3B 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 0E 00 .............?.
005F1A4B 00 00 00 00 00 7C 0E 00 00 00 00 00 00 00 00 00 .....|.........
005F1A5B 00 00 00 00 40 00 00 50 00 00 00 00 00 00 00 00 ....@..P........—————————————————————————
下面开始解压数据:
复制内容到剪贴板
代码:
//005F1703+1F8=005F18FB 块表信息开始在005F18FB,不解压到PE中
//改为:ADD ECX,260 这样加大Size就可以了 ★
005F1128 F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
//ESI=005F1703+360=005F1A63
005F112A 8B45 08 mov eax,dword ptr ss:[ebp+8]
005F112D 0340 3C add eax,dword ptr ds:[eax+3C]
005F1130 0FB640 06 movzx eax,byte ptr ds:[eax+6]
005F1134 8D7D C8 lea edi,dword ptr ss:[ebp-38]
005F1137 57 push edi
005F1138 6A 0A push 0A
005F113A 59 pop ecx
//别忘了要把ESI的值还原为005F18FB ★
005F113B F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
005F113D 5F pop edi
005F113E 8B57 14 mov edx,dword ptr ds:[edi+14]
005F1141 85D2 test edx,edx
005F1143 74 14 je short PE.005F1159
005F1145 56 push esi
005F1146 8B75 08 mov esi,dword ptr ss:[ebp+8]
005F1149 01D6 add esi,edx
005F114B 8B4F 10 mov ecx,dword ptr ds:[edi+10]
005F114E 8B57 0C mov edx,dword ptr ds:[edi+C]
005F1151 8B7D F4 mov edi,dword ptr ss:[ebp-C]
005F1154 01D7 add edi,edx
005F1156 F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
005F1158 5E pop esi
005F1159 48 dec eax
005F115A 75 D8 jnz short PE.005F1134
//代码解压完毕
005F115C 8B55 F4 mov edx,dword ptr ss:[ebp-C]
005F115F 2B55 FC sub edx,dword ptr ss:[ebp-4]
005F1162 74 5C je short PE.005F11C0—————————————————————————————————
二、输入表
不需要用ImportREC来修复输入表,处理一下直接用原来的IAT RVA就行了
复制内容到剪贴板
代码:
005F11C0 8B9D 88FEFFFF mov ebx,dword ptr ss:[ebp-178]
//下面开始处理输入表 [ebp-178]保存的是IAT RVA
005F11C6 85DB test ebx,ebx
005F11C8 74 64 je short PE.005F122E
//因为Morphine没有加密输入表,所以我们把EBX值清0,使这里直接跳转—————————————————————————————————
三、OEP、Dump、完成脱壳
OK,现在可以直接去OEP了
复制内容到剪贴板
代码:
005F122E 8B4D F4 mov ecx,dword ptr ss:[ebp-C]
005F1231 8BBD 30FEFFFF mov edi,dword ptr ss:[ebp-1D0]
005F1237 01CF add edi,ecx
005F1239 64:8B05 18000000 mov eax,dword ptr fs:[18]
005F1240 8B40 30 mov eax,dword ptr ds:[eax+30]
005F1243 8948 08 mov dword ptr ds:[eax+8],ecx
005F1246 8B40 0C mov eax,dword ptr ds:[eax+C]
005F1249 8B40 0C mov eax,dword ptr ds:[eax+C]
005F124C 8948 18 mov dword ptr ds:[eax+18],ecx
005F124F FFD7 call edi ; 004B7220 ★
//飞向光明之巅复制内容到剪贴板
代码:
004B7220 55 push ebp
//OEP ^O^
004B7221 8BEC mov ebp,esp
004B7223 83C4 F0 add esp,-10
004B7226 B8 A86F4B00 mov eax,4B6FA8
004B722B E8 6CF4F4FF call 0040669C
004B7230 A1 C4A04B00 mov eax,dword ptr ds:[4BA0C4]
004B7235 8B00 mov eax,dword ptr ds:[eax]
004B7237 E8 C48CFCFF call 0047FF00拿出PETools,为何不用LordPE?发现LordPE无法直接Dump完全这个EXE进程的数据。
设置PETools的任务察看器选项为全部不选择,完全dump这个进程。
此时程序原来的图标依旧没显示出来。用PEditor打开Dumped.exe,执行dumpfixer(RS=VS & RO=VO)!
OK了,正常运行,脱壳完成!