yangand 发表于 2011-9-10 13:19

Molebox V4.1290脱壳

      前面看了一个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:
00401156   .50            push eax
00401157   .64:8925 00000>mov dword ptr fs:,esp
0040115E   .50            push eax

ALT+M查看内存
Memory map, 条目 17
地址=00400000
大小=00001000 (4096.)
属主=molebox00400000 (自身)
区段=
包含=PE 文件头
类型=Imag 01001002
访问=R
初始访问=RWE

Memory map, 条目 18
地址=00401000
大小=001E2000 (1974272.)
属主=molebox00400000
区段=.text
包含=SFX,代码
类型=Imag 01001002
访问=R
初始访问=RWE

Memory map, 条目 19
地址=005E3000
大小=00002000 (8192.)
属主=molebox00400000
区段=.rdata
包含=数据,输入表
类型=Imag 01001002
访问=R
初始访问=RWE

Memory map, 条目 20
地址=005E5000
大小=00009000 (36864.)
属主=molebox00400000
区段=.rsrc
包含=资源
类型=Imag 01001002
访问=R
初始访问=RWE

在 区段=.rsrc 下内存访问断点,SHIFT+F9,停在
00AE3C6E    66:8378 0E 04   cmp word ptr ds:,0x4
00AE3C73    8D70 10         lea esi,dword ptr ds:
00AE3C76    75 2F         jnz X00AE3CA7
00AE3C78    66:837E 18 19   cmp word ptr ds:,0x19
00AE3C7D    75 28         jnz X00AE3CA7
00AE3C7F    8D4D 08         lea ecx,dword ptr ss:
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:,0x200000
00AE4002    74 05         je X00AE4009
00AE4004    E8 176E0000   call 00AEAE20
00AE4009    8B46 38         mov eax,dword ptr ds:
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:
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:,-0x1
003C1191    C70424 FFFFFFFF mov dword ptr ss:,-0x1
003C1198    FF56 68         call dword ptr ds:
003C119B    83EC 08         sub esp,0x8
003C119E    B8 00000000   mov eax,0x0
003C11A3    8D65 F4         lea esp,dword ptr ss:
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:
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:
003C0030    74 07         je X003C0039
003C0032    3226            xor ah,byte ptr ds:
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:
003C0030    74 07         je X003C0039
003C0032    3226            xor ah,byte ptr ds:
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:,ebx
004F18F1   ?53            push ebx
004F18F2   .8B3D 90C25100 mov edi,dword ptr ds:          ;kernel32.GetModuleHandleA
004F18F8   .FFD7          call edi
004F18FA   .66:8138 4D5Acmp word ptr ds:,0x5A4D
004F18FF   ?75 1F         jnz Xmolebox.004F1920
004F1901   ?8B48 3C       mov ecx,dword ptr ds:
004F1904   .03C8          add ecx,eax
004F1906   .8139 50450000 cmp dword ptr ds:,0x4550
004F190C   .75 12         jnz Xmolebox.004F1920
004F190E   .0FB741 18   movzx eax,word ptr ds:


DUMP出来,用IMPORTREC,剪切掉5个无效指针,修复一下。
到这里工作完成一半。

运行脱壳后的程序,发现没有反应,也没有错误提示。应该是有自校验。
用OD加载。
下bpx ExitProcess, SHIFT+f9,
CPU窗口居然没代码!!!,不过堆栈窗口里有
0012FCC4   0040128A返回到 dumped_.0040128A 来自 dumped_.004F165E
0012FCC8   005A1B24ASCII "f|.molebox.d9308ce138674bcc832cd28091c5a197.lic"
0012FCCC   005A1A20ASCII "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了。




pwzh88 发表于 2011-9-10 13:25

这前好像不这方面的介绍。

jary020 发表于 2011-9-11 11:56

感谢LZ的分析 ,很详细!

zsl01 发表于 2011-9-11 16:04

是啊,分析很细,这样的文章少了。

峰云星炫 发表于 2011-9-12 18:49

前面都看懂了 最后一点 没理解 估计得自己挂个软件 跑跑才能理解了

bdwz 发表于 2011-9-12 22:37

超级战士 发表于 2011-9-15 08:33

学习一下,哈哈!

a408115319 发表于 2011-9-16 01:37

嗯对我等小白来说这文章还是不错···

chinasmu 发表于 2011-9-16 11:22

文章不错!

luxg2588 发表于 2011-9-16 15:22

学习一下,多谢出贴!
页: [1] 2
查看完整版本: Molebox V4.1290脱壳