好友
阅读权限25
听众
最后登录1970-1-1
|
前面看了一个Molebox V4.1290脱壳(http://www.52pojie.cn/thread-84074-1-1.html),在看之前,我想先是一下自己能不能脱掉。结果脱掉了,在看作者的方法,发现方法完全不一样。
现在我把我的方法贴出来,我的方法应该更简单一些,更容易理解。
我也是第一次脱这个壳,用的常规方法,思路是很清楚的。我想对于新手脱壳应该会有一定的帮助,对于大家脱未知壳,在思路上也应该会有一定的帮助。
大家可以到上面的贴子下载文件。
本来想用ESP定律的,F8跟了几步,没找到PUSHAD,于是放弃。
再想用两次内存法,结果跑飞了,放弃。
简单的找OEP的方法都不好用了。
后来想用万能方法,单步法,在OD里单步几分钟,好像也不是个好办法,太费事了。我人懒,还是放弃吧。
后来又想到用内存法和单步法结合起来用,这样可以比单步法省事。
下面开始脱壳:
OD载入,停在
00401141 > $ 55 push ebp
00401142 . 8BEC mov ebp,esp
00401144 . 6A FF push -0x1
00401146 . 68 00000000 push 0x0
0040114B . 68 00000000 push 0x0 ; SE 处理程序安装
00401150 . 64:A1 0000000>mov eax,dword ptr fs:[0]
00401156 . 50 push eax
00401157 . 64:8925 00000>mov dword ptr fs:[0],esp
0040115E . 50 push eax
ALT+M查看内存
Memory map, 条目 17
地址=00400000
大小=00001000 (4096.)
属主=molebox 00400000 (自身)
区段=
包含=PE 文件头
类型=Imag 01001002
访问=R
初始访问=RWE
Memory map, 条目 18
地址=00401000
大小=001E2000 (1974272.)
属主=molebox 00400000
区段=.text
包含=SFX,代码
类型=Imag 01001002
访问=R
初始访问=RWE
Memory map, 条目 19
地址=005E3000
大小=00002000 (8192.)
属主=molebox 00400000
区段=.rdata
包含=数据,输入表
类型=Imag 01001002
访问=R
初始访问=RWE
Memory map, 条目 20
地址=005E5000
大小=00009000 (36864.)
属主=molebox 00400000
区段=.rsrc
包含=资源
类型=Imag 01001002
访问=R
初始访问=RWE
在 区段=.rsrc 下内存访问断点,SHIFT+F9,停在
00AE3C6E 66:8378 0E 04 cmp word ptr ds:[eax+0xE],0x4
00AE3C73 8D70 10 lea esi,dword ptr ds:[eax+0x10]
00AE3C76 75 2F jnz X00AE3CA7
00AE3C78 66:837E 18 19 cmp word ptr ds:[esi+0x18],0x19
00AE3C7D 75 28 jnz X00AE3CA7
00AE3C7F 8D4D 08 lea ecx,dword ptr ss:[ebp+0x8]
00AE3C82 51 push ecx
00AE3C83 6A 04 push 0x4
00AE3C85 6A 04 push 0x4
取消内存断点,开始单步一直到下面代码。
00AE3D39 E8 C2F3FFFF call 00AE3100
00AE3D3E 56 push esi
00AE3D3F E8 8C8C0000 call 00AEC9D0
00AE3D44 83C4 14 add esp,0x14
00AE3D47 5F pop edi
00AE3D48 5E pop esi
00AE3D49 8BE5 mov esp,ebp
00AE3D4B 5D pop ebp
00AE3D4C C3 retn
到这里返回到下面的代码。
00AE3FF8 83C4 04 add esp,0x4
00AE3FFB F746 04 0000200>test dword ptr ds:[esi+0x4],0x200000
00AE4002 74 05 je X00AE4009
00AE4004 E8 176E0000 call 00AEAE20
00AE4009 8B46 38 mov eax,dword ptr ds:[esi+0x38]
00AE400C 85C0 test eax,eax
00AE400E 74 0A je X00AE401A
00AE4010 57 push edi
00AE4011 56 push esi
继续单步到下面代码
00AE406E 57 push edi
00AE406F 56 push esi
00AE4070 E8 2BFDFFFF call 00AE3DA0
00AE4075 83C4 10 add esp,0x10
00AE4078 8B06 mov eax,dword ptr ds:[esi]
00AE407A 03C7 add eax,edi
00AE407C 5F pop edi
00AE407D 5E pop esi
00AE407E 5D pop ebp
00AE407F C2 1000 retn 0x10
继续单步到下面代码
003C1184 83EC 10 sub esp,0x10
003C1187 EB 1A jmp X003C11A3
003C1189 C74424 04 FFFFF>mov dword ptr ss:[esp+0x4],-0x1
003C1191 C70424 FFFFFFFF mov dword ptr ss:[esp],-0x1
003C1198 FF56 68 call dword ptr ds:[esi+0x68]
003C119B 83EC 08 sub esp,0x8
003C119E B8 00000000 mov eax,0x0
003C11A3 8D65 F4 lea esp,dword ptr ss:[ebp-0xC]
003C11A6 5B pop ebx
003C11A7 5E pop esi
003C11A8 5F pop edi
003C11A9 5D pop ebp
003C11AA C3 retn
返回到下面代码
003C087D 8D65 F4 lea esp,dword ptr ss:[ebp-0xC]
003C0880 5B pop ebx
003C0881 5E pop esi
003C0882 5F pop edi
003C0883 5D pop ebp
003C0884 C3 retn
返回到下面代码
003C0026 5F pop edi ; ntdll.7C920000
003C0027 5E pop esi
003C0028 5E pop esi
003C0029 89EC mov esp,ebp
003C002B 5D pop ebp
003C002C FFE0 jmp eax
003C002E 3206 xor al,byte ptr ds:[esi]
003C0030 74 07 je X003C0039
003C0032 3226 xor ah,byte ptr ds:[esi]
003C0034 74 03 je X003C0039
003C0036 31C0 xor eax,eax
003C0038 C3 retn
返回到下面代码
003C0026 5F pop edi
003C0027 5E pop esi
003C0028 5E pop esi
003C0029 89EC mov esp,ebp
003C002B 5D pop ebp
003C002C - FFE0 jmp eax ; molebox.004F18E0 (跳到OEP)
003C002E 3206 xor al,byte ptr ds:[esi]
003C0030 74 07 je X003C0039
003C0032 3226 xor ah,byte ptr ds:[esi]
003C0034 74 03 je X003C0039
003C0036 31C0 xor eax,eax
到上面003C002C - FFE0 jmp eax (堆栈里eax=004F18E0 (molebox.004F18E0)),
004F18E0 是的代码区段里的(00401000-005E3000),天草教程里说,跳到OEP的跳转是个大跳转。我这里补充一下,这种跨区段跳转到代码段的大跳转就是跳到OEP的。
OEP如下:
004F18E0 . 6A 74 push 0x74
004F18E2 . 68 D0E55600 push molebox.0056E5D0
004F18E7 ? E8 A4030000 call molebox.004F1C90
004F18EC . 33DB xor ebx,ebx
004F18EE . 895D E0 mov dword ptr ss:[ebp-0x20],ebx
004F18F1 ? 53 push ebx
004F18F2 . 8B3D 90C25100 mov edi,dword ptr ds:[0x51C290] ; kernel32.GetModuleHandleA
004F18F8 . FFD7 call edi
004F18FA . 66:8138 4D5A cmp word ptr ds:[eax],0x5A4D
004F18FF ? 75 1F jnz Xmolebox.004F1920
004F1901 ? 8B48 3C mov ecx,dword ptr ds:[eax+0x3C]
004F1904 . 03C8 add ecx,eax
004F1906 . 8139 50450000 cmp dword ptr ds:[ecx],0x4550
004F190C . 75 12 jnz Xmolebox.004F1920
004F190E . 0FB741 18 movzx eax,word ptr ds:[ecx+0x18]
DUMP出来,用IMPORTREC,剪切掉5个无效指针,修复一下。
到这里工作完成一半。
运行脱壳后的程序,发现没有反应,也没有错误提示。应该是有自校验。
用OD加载。
下bpx ExitProcess, SHIFT+f9,
CPU窗口居然没代码!!!,不过堆栈窗口里有
0012FCC4 0040128A 返回到 dumped_.0040128A 来自 dumped_.004F165E
0012FCC8 005A1B24 ASCII "f|.molebox.d9308ce138674bcc832cd28091c5a197.lic"
0012FCCC 005A1A20 ASCII "1e85e314136c6963656e73652e6d6f6c65626f782e636f6d00000050172f6c6963656e73652f61637469766174652e70793f713d45070000000000000000000000000000d9abb8c88b3f8c4e5ddb59d92fb09fb10503000000000000000000000000000005b04ce517b91a5b0d59e676bd4d3fe9;R52R"...
0012FCD0 00000000
0012FCD4 0040FC9F 返回到 dumped_.0040FC9F 来自 dumped_.00401279
0012FCD8 00000001
我们在0012FCC4 0040128A ,右键选择在汇编窗口里跟随。
来到这里00401279 53 push ebx
0040127A |. 68 201A5A00 push dumped_.005A1A20 ; ASCII "1e85e314136c6963656e73652e6d6f6c65626f782e636f6d00000050172f6c6963656e73652f61637469766174652e70793f713d45070000000000000000000000000000d9abb8c88b3f8c4e5ddb59d92fb09fb10503000000000000000000000000000005b04ce517b91a5b0d59e676bd4d3fe9;R52R"...
0040127F |. BB 241B5A00 mov ebx,dumped_.005A1B24 ; ASCII "f|.molebox.d9308ce138674bcc832cd28091c5a197.lic"
00401284 |. 53 push ebx
00401285 |. E8 D4030F00 call dumped_.004F165E
0040128A |. 85C0 test eax,eax
0040128C |. 74 3E je Xdumped_.004012CC
上面没有跳过00401285的跳转。
那就在的00401279 下断,重新往上面回溯一下。
回溯了几层,也没发现有效跳转。看来找跳转失败。那么怎么才能让00401285这个CALL, 不实现呢? 除了跳转就就NOP,还有RETN.
经尝试,把00401279这里 PUSH EBX改成RETN,或者把这一段全NOP掉,在保存文件就OK了。
|
免费评分
-
查看全部评分
|