【文章标题】: 脱 Armadillo 5.0 标准方式+反调试+IAT混淆
【文章作者】: 王猛
【作者邮箱】: 12985462@QQ.com
【作者主页】:
d3eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0R3I4L8h3W2D9i4K6u0W2j5$3^5`.
【作者QQ号】: 12985462
【下载地址】: 自己搜索下载
【加壳方式】: Armadillo v5 标准方式+反调试+IAT混淆
【使用工具】: 野猪,ImpREC、ArmaPD、ArmaFp
【操作平台】: Windows SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
穿山甲这款壳子很早以前我就在网络上见过,只是我遇到的软件都不会用穿山甲来加壳,所以也就没过多的关注它。
首先,以一个穿山甲5.0版的CrackME做例子展示如何脱壳,当然,我同样准备了一个视频文件作为VIP教材发布给学员班的同学们使用。在这里
感谢SND团队的教导,没有他们的教程,没有他们的网站我真不知道再有那里可以找到如此多的新手教程。
我们工作的环境和需要的工具:
Windows XP SP2 (简称:XP)
理由:我们用到的一款工具只支持WINDOWS SP2,我试过Windows 2000平台这款工具是没法工作的。
Ollydbg v1.10 *野猪DBG v2.0 修改版* (简称:野猪 ;))
理由:这款修改版可以绕过多款强壳的调试器检测,最特别的地方是他采用了注入方式。
Armadillo Process Detach v1.1 (简称:ArmaPD)
一款可以帮助我们附加到穿山甲进程上的工具,附加到进程上是脱被穿山甲保护程序的基础工作。这款工具,也是我刚刚提到的只支持Windows
XP SP2的那个东东。
Armadillo find protected v1.3 (简称:ArmaFP)
一款用来检测穿山甲壳子加密状态的工具,可以识别用来加密的穿山甲版本和使用了哪些加密技术。这款工具和PEID等识别工具类似,识别版
本是否准确也要依靠签名,所以请您经常更新该软件的签名库文件。
Import REConstructor v1.6 (简称ImpREC)
一款用来修复IAT的工具,IAT是与否保证可是程序可以顺利运行的基础。我们将使用这款工具DUMP数据并修复进行修复。
LordPE-Deluxe (简称:LoadPE)
一款PE文件工具,在重建PE文件时会用到他。
首先,我们使用ArmaFP检测下程序受保护的状态。打开ArmaFP并将程序拖入主窗口,ArmaFP非常利落的告诉我们程序受到保护的状态:
!- Protected Armadillo
Protection system (Professional) <-- 穿山甲的版本类型,此为专业版
!- <Protection Options>
Standard protection or Minimum protection <-- 加密选项
CopyMem-II
Enable Import Table Elimination
Enable Strategic Code Splicing
!- <Backup Key Options> <-- key 备份
No Registry Keys at All
!- <Compression Options> <-- 数据压缩
Minimal/Fastest Compression
!- <Other Options> <-- 其他选项
Store Environment Vars Externally
Allow Only One Copy
Use eSellerate Edition Keys
Use Digital River Edition Keys
……
最后应该有签名和号码的,可惜ArmaFP目前的版本在我的XP上,检测穿山甲5.0的程序会造成崩溃,所以没有获得到版本号。(怪:这个工具在
Windows 2000上检测5.0可是正常的说!)
事前检测是个好的习惯,这让我们心里有了底。比如眼前这款程序使用的是穿山甲的标准加密方式。现在些准备功夫!
打开ArmaPD,将目标程序入主界面,当看到下面的结果时说明ArmaPD已经为我们进行附加进程做好了准备。
DONE!
Child process ID: 00000BE0
Entry point: 004A2DC2
Original bytes: E8E3
Child process ID 告诉我们将要附加的进程编号。
Entry point 告诉我们穿山甲的入口点位置。为便于我们附加进程ArmaPD在后台会替换入口点004A2DC2的代码。
Original Bytes 原始代码。我们要把这些代码记住,我们附加进去后为了进行调试代码还是要替换过来的。
ok,说了这么多基本的东西,相信大家已经迫不及待的要动手了干了。跟我来!
打开野猪,并附加到ArmaPD告诉我们的BE0进程上。此时,程序会停在 DbgBreakPoint 断点上,在堆栈中观察会得到类似结果:
7C9707A8 RETURN to ntdll.7C9707A8 from ntdll.DbgBreakPoint
接着用 Ctrl + F12 飞到 ArmaPD 告诉我们的穿山甲的入口点。注意,这里的代码已经被ArmaPD修改过!
004A2DC2 UnpackM>- EB FE JMP SHORT 004A2DC2 ; UnpackMe.<Modul3EntryPoint>
004A2DC4 40 INC EAX
004A2DC5 0000 ADD BYTE PTR DS:[EAX], AL
004A2DC7 ^ E9 16FEFFFF JMP 004A2BE2 ; UnpackMe.004A2BE2
ok!为了进行调试,现在我们需要把入口点的代码替换回ArmaPD告诉我们的原始代码。选中004A2DC2一行,按 Ctrl+E 打开二进制编辑窗口,
在HEX+02一栏用E8E3替换EBFE,点确定保存!完成后代码便恢复到原始状态。我们可以开始调试了!
004A2DC2 UnpackM> E8 E3400000 CALL 004A6EAA ; UnpackMe.004A6EAA
004A2DC7 ^ E9 16FEFFFF JMP 004A2BE2 ; UnpackMe.004A2BE2
删除全部 软硬断点 设置断点 VirtualProtect 尝试恢复IAT!
BP VirtualProtect
Shift + F9 继续,
程序断在0048E8F7处,注意堆栈。 穿山甲开始建立虚拟机了!
0012F648 0048E8F7 /C4LL to VirtualProtect from UnpackMe.0048E8F1
0012F64C 00E61000 |Address = 00E61000
0012F650 0006C82C |Size = 6C82C (444460.)
0012F654 00000040 |NewProtect = PAGE_EXECUTE_READWRITE
0012F658 0012F67C \pOldProtect = 0012F67C
按Shift+F9继续走,注意每次中断时堆栈的编号。
当看到类似下面的内容时,停下来。
00129470 00EAA814 /C4LL to VirtualProtect from 00EAA80E
00129474 0045F118 |Address = UnpackMe.0045F118
00129478 0000008C |Size = 8C (140.)
0012947C 00000004 |NewProtect = PAGE_READWRITE
00129480 0012C028 \pOldProtect = 0012C028
有些朋友或许会问,为什么是这里?因为这里是PUSH 14之前最后一次断在 VirtualProtect 处。如果您感觉很陌生,不停的用Shift+F9似乎不
是一个好注意。老套的,善用Ctrl+F9以及用F8两个快捷键走下来是非常明智的做法。
现在,我们改按 Ctrl+F9 + F8 走到下面:
00EAA814 6A 14 PUSH 14
00EAA816 E8 FBCA0000 CALL 00EB7316
00EAA81B 83C4 04 ADD ESP, 4
00EAA81E 8985 84ABFFFF MOV DWORD PTR SS:[EBP+FFFFAB84], EAX
00EAA824 83BD 84ABFFFF 00 CMP DWORD PTR SS:[EBP+FFFFAB84], 0
我们看到了什么?PUSH 14 啊哈!穿山甲的经典的入口!我们现在下来代码找寻PUSH 100指令,并修改它下方第一个CALL呼叫地址的代码为为
RETN。这是为了防止穿山甲在IAT上捣乱!
双击EIP,让我们回到
00EAA814 6A 14 PUSH 14
00EAA816 E8 FBCA0000 CALL 00EB7316
00EAA81B 83C4 04 ADD ESP, 4
00EAA81E 8985 84ABFFFF MOV DWORD PTR SS:[EBP+FFFFAB84], EAX
00EAA824 83BD 84ABFFFF 00 CMP DWORD PTR SS:[EBP+FFFFAB84], 0
清除所有的断点,用命令 BP CreateThread 拦截CreateThread断点。
Shift+F9,Ctrl+F9,再F8,再Ctrl+9,再F8,我们来到了00EAFEF处,这里是VM将要载入代码的地方,穿山甲的VM载入程序必须要走到真实的
OEP。
00EAF1EF 83C4 04 ADD ESP, 4
00EAF1F2 B9 B8B4ED00 MOV ECX, 0EDB4B8
00EAF1F7 E8 B4BFFBFF CALL 00E6B1B0
00EAF1FC 0FB6D0 MOVZX EDX, AL
00EAF1FF 85D2 TEST EDX, EDX
瞪大眼睛注意ECX,穿山甲系列的壳子OEP地址都出现在ECX寄存器。
我们搜索代码 CALL NEAR ECX,掠过第一个,在第二个下手!
用F2下段,F9走过来,再F7过去!!嘿嘿!现在,我们就到了OEP了!
打开ImpREC,有两个同名的进程,要选择我们附加的进程, 。。。。。。。。。。(ArmaPD会告诉你地址)。
输入OEP的地址XXXXX,点击获取按钮,我们将得到一个不完整的IAT列表,不过没关系。
点击显示“无效函数”按钮,让ImpREC帮我们找处那些函数无效。点右键选择“跟踪级别一”,ImpREC忙碌了一阵子之后,是不是还有很多函
数无法修复??别失望,这就对了!再“无效函数”按钮,可以找出一大把东西,在右键菜单中选择“剪切函数”,嘿嘿,再看看,是不是全
部的函数都已经被你找到了!
现在开始DUMP,在右键菜单试用高级指令-->“选择代码区段” 命令,点击“完整转储”把数据DUMP下来。点主界面上的“修复转储文件”按
钮修复刚才DUMP出来的文件,嘿嘿!我们完工了!
--------------------------------------------------------------------------------
【经验总结】
常见问题:
在这次Dump过程中,我自己卡壳很多次,包括工具准备和写这篇文章前后总过花费了8个小时,我把一些我遇到的问题和解
决方法在和大家分享
一下。希望可以节约下您的时间!
一、那里可以下载到文中提到的工具?
网络,这些软件都是公开的工具,你可以在网络上轻易获得。
二、为什么附加进程后要按Ctrl+F12?
没有为什么,纯属我的习惯,您可以用F9+F12或者其他什么方法,总之能走到穿山甲的OPE就好了。
三、为什么野猪在修改代码的时候会崩溃?
野猪基本上不太会,因此它没带advancedolly.dll这个插件,如果您遇到了这样的问题,把advancedolly.dll升级到1.26
Beta 10或者暂时删
除这个插件,问题就解决了。
四、为什么下了VirtualProtect断点后,按Shift+F9程序,但是没有被拦截在 VirtualProtect 断点上?
基本上是你太粗心了!记得把代码修改会ArmaFP提示给您的原始代码!
五、为什么我脱壳出来的文件,修复后可以看到程序界面,但是会有弹出很多的错误提示对话框?
排除程序本身自校验的问题。应该是ImpREC参数设置上存在问题!在ImpREC选项中,至少要选中 “创建新的IAT”和 “修
正EP到OEP”!
六、这篇文章只对Armadillo 5 有效吗?
不是的,再脱Armadillo 4.66的时候也可以这么做!只是Armadillo加密保护方式上,只能对付使用标准方式保护的程序。
--------------------------------------------------------------------------------
【版权声明】: 本文由王猛(
783K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0R3I4L8h3W2D9i4K6u0W2j5$3&6Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8e0g2Q4z5p5g2Q4z5f1k6Q4c8e0g2Q4z5o6S2Q4z5f1u0Q4c8e0k6Q4z5e0u0Q4b7U0m8Q4c8e0g2Q4z5o6k6Q4z5e0W2Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0S2Q4b7V1c8Q4b7f1y4Q4c8e0S2Q4b7V1c8Q4b7V1c8Q4c8e0S2Q4b7f1k6Q4b7U0N6Q4c8e0k6Q4b7U0y4Q4b7e0S2Q4c8e0k6Q4z5e0S2Q4z5p5g2Q4c8e0c8Q4b7V1c8Q4z5f1y4Q4c8e0S2Q4z5o6m8Q4z5o6g2Q4c8e0g2Q4b7U0W2Q4b7U0k6Q4c8e0c8Q4b7V1k6Q4z5f1c8Q4c8e0k6Q4z5p5y4Q4z5o6q4Q4c8e0k6Q4z5e0k6Q4z5o6N6Q4c8e0N6Q4b7f1u0Q4b7e0m8Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0g2Q4b7f1g2Q4z5p5y4Q4c8e0k6Q4z5e0g2Q4b7U0c8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0S2Q4b7U0m8Q4b7e0u0Q4c8e0S2Q4b7U0m8Q4b7e0u0Q4c8f1k6Q4b7V1y4Q4z5o6p5`.
2007年07月01日 23:09:42
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课