吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11334|回复: 21
收起左侧

[分享] 手脱MoleBox(学习历程)

  [复制链接]
开始的复活节 发表于 2017-4-28 23:41
声明:

       1.纪录自己成长历程,与大家分享
       2.由于技术与能力,如有疏漏错误,欢迎指出,高手轻喷

简述:
      
       吾爱破解脱壳练习-----MoleBox V2.6.5,这一期研究的有些时候了,MoleBox这个壳找到OEP不难,但是修复却让我投入了很多时间,于是我开始逐步研究该贴下的所有脱文,感谢unpack关于该壳的详细分析,
解决了我的一些困惑。之后我继续在论坛里搜索,发现该壳还可以更加困难,涉及到了解捆绑文件的问题,让我头疼了一阵。下面以一个例子先逐步分析一下MoleBox的壳.
    相关经验来自:http://www.52pojie.cn/thread-11306-2-1.html
              http://www.52pojie.cn/forum.php?mod=viewthread&tid=12149
      例子来源:http://www.52pojie.cn/thread-233561-1-1.html

1.发送到PEID查壳,插件核心扫描:
PESniffer:MoleBox V2.X -> MoleStudio.com
PEiDDSCAN:Microsoft Visual C++ 6.0 [Overlay]

2.寻找OEP,这个壳的OEP用ESP定理法就能快速找到,虽然简单,但是我们还是来看一下。
[Asm] 纯文本查看 复制代码
004E3BD3 >  E8 00000000     call 多记忆桌.004E3BD8	;//加载OD程序停在此处
004E3BD8    60              pushad
004E3BD9    E8 4F000000     call 多记忆桌.004E3C2D	;//此处可以用ESP定理法(hr 12ffa0)


F9后来到OEP的特征入口
[Asm] 纯文本查看 复制代码
004E37B1    58              pop eax                                  ; 多记忆桌.004E3BD8
004E37B2    58              pop eax
004E37B3    FFD0            call eax			;//F7跟进就到OEP了


[Asm] 纯文本查看 复制代码
0045159E    55              push ebp		;//OEP
0045159F    8BEC            mov ebp,esp
004515A1    6A FF           push -0x1
004515A3    68 78034800     push 多记忆桌.00480378
004515A8    68 843D4500     push 多记忆桌.00453D84
004515AD    64:A1 00000000  mov eax,dword ptr fs:[0]
004515B3    50              push eax
004515B4    64:8925 0000000>mov dword ptr fs:[0],esp
004515BB    83EC 58         sub esp,0x58
004515BE    53              push ebx
004515BF    56              push esi
004515C0    57              push edi
004515C1    8965 E8         mov dword ptr ss:[ebp-0x18],esp


修复才是这个壳的重头戏,用importREC修复一共有19个指针无效,用等级1就全部修复完了。但是我们在记录窗口可以看到语句
-------------------------------------------------------------------------------------------------------
恭喜!已没有无效的指针,但现在的问题是:它能运行吗?:-)
-------------------------------------------------------------------------------------------------------
果然这个程序没有那么简单就运行起来,有了ORiEN的经验我们可以用LoadPE检查一下是不是区段出现了问题,但这里不是。我们手动修复指针,
因为这个壳在解密指针后的某一步又加密了指针,我们需要把它找出来。在importREC中可以看到首个无效指针是:rva:000711E4 pte:004F0A70
在711E4加上基址400000后4711E4,等一下要跟踪观察该指针的变化来寻找出错的那步。

ctrl+F2重新载入OD,首先在命令中下d 4711E4,注意观察数据窗口的变化

004711E4  C055741C        ;//下硬件访问断点,每一步都要注意这一步的变化
004711E8  27BBD7D5
004711EC  8E87F457
004711F0  8F487B49

F9 6次之后数据访问断点出现了变化。
004711E4  7C8322D4  kernel32.UnlockFile
004711E8  0008924C

程序也来到了,这时候要单步跟,否则我们可能因为程序跑的太快错过了细节
[Asm] 纯文本查看 复制代码
004EAEF8   /EB 2C           jmp short 多记忆桌.004EAF26
004EAEFA   |8B55 F4         mov edx,dword ptr ss:[ebp-0xC]
004EAEFD   |8B02            mov eax,dword ptr ds:[edx]
004EAEFF   |25 FFFF0000     and eax,0xFFFF
004EAF04   |8945 D0         mov dword ptr ss:[ebp-0x30],eax
004EAF07   |8B4D D0         mov ecx,dword ptr ss:[ebp-0x30]
004EAF0A   |51              push ecx
004EAF0B   |8B55 EC         mov edx,dword ptr ss:[ebp-0x14]
004EAF0E   |52              push edx
004EAF0F   |FF15 BC774F00   call dword ptr ds:[0x4F77BC]             ; kernel32.GetProcAddress
004EAF15   |8945 D4         mov dword ptr ss:[ebp-0x2C],eax
004EAF18   |837D D4 00      cmp dword ptr ss:[ebp-0x2C],0x0
004EAF1C   |74 08           je short 多记忆桌.004EAF26
004EAF1E   |8B45 E0         mov eax,dword ptr ss:[ebp-0x20]
004EAF21   |8B4D D4         mov ecx,dword ptr ss:[ebp-0x2C]
004EAF24   |8908            mov dword ptr ds:[eax],ecx
004EAF26   \8B55 F0         mov edx,dword ptr ss:[ebp-0x10]


单步到下面
[Asm] 纯文本查看 复制代码
004EAF41    52              push edx
004EAF42    E8 D9060000     call 多记忆桌.004EB620 	;//call是绕不过的,指针的变化也出现在这里
004EAF47    83C4 0C         add esp,0xC			;//在这句下硬件执行断点运行后会发现,到这步变化的数据消失了
004EAF4A  ^ E9 32FFFFFF     jmp 多记忆桌.004EAE81	;//上面的尝试重复说明了call这步指针又重新加密了


F7跟进后来到此处,此时单步跟,并且也要注意寄存器窗口
[Asm] 纯文本查看 复制代码
004EB620    55              push ebp
004EB621    8BEC            mov ebp,esp
004EB623    83EC 10         sub esp,0x10
004EB626    C745 FC 0000000>mov dword ptr ss:[ebp-0x4],0x0
004EB62D    833D 5CC14F00 0>cmp dword ptr ds:[0x4FC15C],0x0
004EB634    75 0A           jnz short 多记忆桌.004EB640
004EB636    B9 0A0000EF     mov ecx,0xEF00000A
004EB63B    E8 D72F0000     call 多记忆桌.004EE617
004EB640    8B45 08         mov eax,dword ptr ss:[ebp+0x8]
004EB643    8B08            mov ecx,dword ptr ds:[eax]
004EB645    51              push ecx
004EB646    8B0D 5CC14F00   mov ecx,dword ptr ds:[0x4FC15C]
004EB64C    E8 13650000     call 多记忆桌.004F1B64
004EB651    8945 F8         mov dword ptr ss:[ebp-0x8],eax
004EB654    837D F8 00      cmp dword ptr ss:[ebp-0x8],0x0
004EB658    74 45           je short 多记忆桌.004EB69F
004EB65A    8D55 F0         lea edx,dword ptr ss:[ebp-0x10]
004EB65D    52              push edx
004EB65E    6A 04           push 0x4
004EB660    6A 04           push 0x4
004EB662    8B45 08         mov eax,dword ptr ss:[ebp+0x8]
004EB665    50              push eax
004EB666    FF15 40784F00   call dword ptr ds:[0x4F7840]             ; kernel32.VirtualProtect
004EB66C    85C0            test eax,eax
004EB66E    75 0A           jnz short 多记忆桌.004EB67A
004EB670    B9 0B0000EF     mov ecx,0xEF00000B
004EB675    E8 9D2F0000     call 多记忆桌.004EE617
004EB67A    8B4D 08         mov ecx,dword ptr ss:[ebp+0x8]
004EB67D    8B55 F8         mov edx,dword ptr ss:[ebp-0x8]
004EB680    8B02            mov eax,dword ptr ds:[edx]			
004EB682    8901            mov dword ptr ds:[ecx],eax			;//注意堆栈窗口的eax寄存器
004EB684    8D4D F4         lea ecx,dword ptr ss:[ebp-0xC]		;//执行上一步后,数据窗口中发现指针已经加密了,看汇编也可以猜出上步用eax取代变量实现了加密
004EB687    51              push ecx						
004EB688    8B55 F0         mov edx,dword ptr ss:[ebp-0x10]
004EB68B    52              push edx
004EB68C    6A 04           push 0x4
004EB68E    8B45 08         mov eax,dword ptr ss:[ebp+0x8]
004EB691    50              push eax
004EB692    FF15 40784F00   call dword ptr ds:[0x4F7840]             ; kernel32.VirtualProtect


所有经过上面的分析我们有两种方法跳过加密
1.直接nop掉(004EB682    8901            mov dword ptr ds:[ecx],eax)
2.magic jump 将je改为jmp 这样就直接跳过了加密代码(004EB658   /74 45           je short 多记忆桌.004EB69F)

我用第一种方法吧,在(004EB682    8901            mov dword ptr ds:[ecx],eax)处下硬件执行断点,重载od
[Asm] 纯文本查看 复制代码
004E3BD3 >  E8 00000000     call 多记忆桌.004E3BD8	;//加载OD程序停在此处,删除之前为了查看指针的跟随断点
004E3BD8    60              pushad
004E3BD9    E8 4F000000     call 多记忆桌.004E3C2D	;//此处可以用ESP定理法(hr 12ffa0)


F9 1次来到加密处,nop掉,删除掉硬件执行断点
[Asm] 纯文本查看 复制代码
004EB682    8901            mov dword ptr ds:[ecx],eax               ; 多记忆桌.004F16C8 ;//nop掉


F9后来到OEP的特征入口
[Asm] 纯文本查看 复制代码
F9004E37B1    58              pop eax                                  ; 多记忆桌.004E3BD8
004E37B2    58              pop eax
004E37B3    FFD0            call eax			;//F7跟进就到OEP了

修复是已经不缺少指针了。

但现在程序修复后运行时跑不起,说丢失了SkinH_EL.dll文件,我这里在网上下载了SkinH_EL.dll,程序就跑起来了。这里可能有一部分人疑惑,这个比较难,涉及到了该壳捆绑文件的问题,以后分析透彻了另开一贴专门说。
先介绍一种更快一些脱此壳的方法。
分析了加密过程后,发现加密是在两段VirtualProtect间实现的,VirtualProtect顾名思义是虚拟保护,应该起到内存保护作用吧。这能是该壳关键代码在此处的原因

[Asm] 纯文本查看 复制代码
004E3BD3 >  E8 00000000     call 多记忆桌.004E3BD8	;//加载OD程序停在此处
004E3BD8    60              pushad
004E3BD9    E8 4F000000     call 多记忆桌.004E3C2D	;//此处可以用ESP定理法(hr 12ffa0)先不急运行 下bp VirtualProtect


F9运行后6次后堆栈窗口
[Asm] 纯文本查看 复制代码
0012FAE0   004EB66C  /CALL 到 VirtualProtect 来自 多记忆桌.004EB666  ;//从此句看出ALT+F9返回4EB66C,返回后离我们的nop处非常近,ALT+F9返回用户代码
0012FAE4   77DA1034  |Address = <&KERNEL32.CloseHandle>
0012FAE8   00000004  |Size = 4
0012FAEC   00000004  |NewProtect = PAGE_READWRITE
0012FAF0   0012FAF4  \pOldProtect = 0012FAF4
0012FAF4   0012FB0C
0012FAF8   004F1B80  返回到 多记忆桌.004F1B80 来自 多记忆桌.004F1B84
0012FAFC   004F7320  多记忆桌.004F7320
0012FB00   00000000
0012FB04  /0012FB7C
0012FB08  |004EB5B7  返回到 多记忆桌.004EB5B7 来自 多记忆桌.004EB620
0012FB0C  |77DA1034  <&KERNEL32.CloseHandle>
0012FB10  |76B2EBA0  ASCII "ADVAPI32.dll"
0012FB14  |77E12AE4  ASCII "KERNEL32.dll"
0012FB18  |003C2104
0012FB1C  |004E3C1E  多记忆桌.004E3C1E
0012FB20  |7FFDF000
0012FB24  |7C92EB79  返回到 ntdll.7C92EB79 来自 ntdll.RtlMultiByteToUnicodeN
0012FB28  |7FFDEC00  UNICODE "ntdll.dll"
0012FB2C  |77E12AE4  ASCII "KERNEL32.dll"
0012FB30  |7C800000  kernel32.7C800000
0012FB34  |77DA1034  <&KERNEL32.CloseHandle>


[Asm] 纯文本查看 复制代码
004EB66C    85C0            test eax,eax
004EB66E    75 0A           jnz short 多记忆桌.004EB67A
004EB670    B9 0B0000EF     mov ecx,0xEF00000B
004EB675    E8 9D2F0000     call 多记忆桌.004EE617
004EB67A    8B4D 08         mov ecx,dword ptr ss:[ebp+0x8]
004EB67D    8B55 F8         mov edx,dword ptr ss:[ebp-0x8]
004EB680    8B02            mov eax,dword ptr ds:[edx]
004EB682    8901            mov dword ptr ds:[ecx],eax		;//nop掉此处,ALT+b删除刚刚的断点,返回窗口F9运行


[Asm] 纯文本查看 复制代码
F9后来到OEP的特征入口,又可以脱壳了。
004E37B1    58              pop eax                                  ; 多记忆桌.004E3BD8
004E37B2    58              pop eax
004E37B3    FFD0            call eax			;//F7跟进就到OEP了







MoleBox V2.X.7z

840.46 KB, 下载次数: 107, 下载积分: 吾爱币 -1 CB

附件

免费评分

参与人数 10吾爱币 +11 热心值 +9 收起 理由
NSP + 1 + 1 我也想学
gunxsword + 1 + 1 之前也遇到过,修复确实比较难啊!
qaz003 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
因素 + 1 + 1 我很赞同!
xingxingzzz + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
海盗小K + 1 + 1 我很赞同!
993677088 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
netle8 + 1 + 1 谢谢@Thanks!
xxhaishixx + 2 + 1 我很赞同!
qmopl + 1 + 1 已答复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kxdkxd 发表于 2019-2-1 21:00
[img=110,0]https://www.52pojie.cn/forum.php?mod=image&aid=1355679&size=300x300&key=ac0646a1c619a41e&nocache=yes&type=贴图错误,请阅读“贴图帮助”。lz好,我这个程序esp定律,硬件断点f9之后到了这里,没有一串pop的特征,怎么办
无标题.png
tomemouse 发表于 2017-4-28 23:46
gunxsword 发表于 2017-4-29 00:02
以前遇到过,没拿下,挺麻烦的,好好学习一下,感谢大神!
csc2007 发表于 2017-4-29 00:16
好好学习一下
九梅.刺客 发表于 2017-4-29 01:01
来看看这个好厉害
littlebit 发表于 2017-4-29 02:04
{:1_930:}多谢分享学习。
xxhaishixx 发表于 2017-4-29 04:14
很不错,受教了。
头像被屏蔽
haidao911 发表于 2017-4-29 04:19
提示: 作者被禁止或删除 内容自动屏蔽
黑山走天涯 发表于 2017-4-29 05:34
支持下!谢谢分享!!!
头像被屏蔽
chen1234 发表于 2017-4-29 07:05 来自手机
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 22:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表