好友
阅读权限10
听众
最后登录1970-1-1
|
jsjt
发表于 2008-12-4 15:24
在GTLS的指引下,我顺利完成了一次利用脚本对Armadillo进行脱壳并优化最终文件的过程。为了更多像我一样的新人可以应对Armadillo壳保护,我对方法和步骤进行了总结,希望对您能有所帮助。
一、 “壳”性识别
脱壳的第一步是对壳进行识别,之后进行针对性操作方能顺利脱下。对于Armadillo 这款壳,我们需要对壳的版本以及加密特性进行了解。根据不同的加密特性,我们在具体操作不尽相同。为便于识别壳特性,我们需要两款软件:
PEiD
Armadillo find protected
PEiD是一款通用壳检测工具,根据壳特征库目前可以识别各种壳达2000多款。面对一个程序,首先应当利用该软件确定壳的类型。
该软件使用方法简单,仅需将目标软件拖入PEiD主界面即可。使用效果如下图:
PEiD告诉我们目标被Armadillo壳保护。Armadillo脱壳与受保护的状态密切相关。怎么知道目标被Armadillo如何保护呢?在这里我就需要使用Armadillo find protected 这款工具。Armadillo find protected同样依靠特征库进行识别,使用该工具我们可以了解目标被保护的状态以及所使用的Armadillo版本等详细情况。Armadillo find protected同样支持拖放操作。使用效果如下图:
通过上述步骤,我们可以确定目标的确被 Armadillo 保护,保护方式和所用版本在日志窗口中均有显示。现在,我们理解了如何去识别被Armadillo保护的程序。这为针对性的进行处理提供了坚实的基础。同时使大家明白了,为了提高PEiD等软件识别的精确度,应当经常升级壳特征库。
二、 适用范围
我们针对目标边讲边做。我们选定的目标没有使用COPYMEMII技术。因此,在目标程序未使用COPYMEMII技术的情况下,文中讲解的方法均适用。在实际过程中,我试脱到v4.66这一方法都是可行的。同时,这里介绍的脱壳方法对v5.0不适用。本文同时讲解了如何修复NTDLL.DLL解决跨平台问题,优化PE文件结构减少脱壳后文件体积等知识。
三、 脱壳解密
为了给大家一个清晰直观的印象,我结合GTLS推荐的目标进行示范。我们的目标是一个传奇世界脱机外挂,在这里只谈脱壳和优化。
通过第一步,我们可以知道,目标受保护情况如下:
<------- 04-07-2007 12:43:43 ------->
C:Documents and SettingsAdministrator桌面JXTFlyWoool.exe
!- Protected Armadillo
Protection system (Professional)
!- <Protection Options>
Debug-Blocker
Enable Import Table Elimination
Enable Strategic Code Splicing
Enable Nanomites Processing
!- <Backup Key Options>
Fixed Backup Keys
!- <Compression Options>
Better/Slower Compression
!- <Other Options>
!- Version 4.62 27 November 2006
对于这种加壳方式,我们可以使用脚本直接脱并借助ArmInline进行修复。
首先,我们在OD中载入程序,并选择脚本。在这里我选择的是一款名为Armadillo Standard Unpack + Strategic Code Splicing.txt 的脚本,如下图:
选择好脚本点“打开”按钮,脚本将帮助你找寻OEP 。在脚本运行过程中会弹出一些提示信息。在发现Strategic Code Splicing时,会弹出下面的对话框询问您是否修复,我们选择“是”,利用脚本修复,当然也可以选“否”利用ArmInline修复。如下图:
脚本继续运行,当走到OEP时,会再次弹出下面的对话框提示您“已经找到OEP,可以利用LoadPE进行DUMP并用ImpREC修复IAT”。点“确定”结束脚本运行。如图:
脚本运行完成后,会再次提示您。如下图,当看到这个图片展示的提示内容才算是真正的运行完毕。点“确定”按钮完成。
通过运用脚本,我们已经成功找到了OEP004E5EAC,如图:
现在还没完工。接下来我们利用ArmInline修复其他的保护。
请按照上图注明的数字顺序进行操作。如果我们希望以手工方式修复 Code Splicing ,而不是用脚本,我们要面对人工纠正Code Splicing长度参数的问题。参数的寻找方法如下图:
四、 修复文件
经过上述操作,我们还没有完事。我们现在要DUMP出文件,修复 Nanomites Processing 。
在这里,我用ImpREC进行DUMP,方法如下图:
回到ArmInline中,继续我们的修复过程。如下图:
具体修复什么,要根据目标保护方式和脱壳方法而定。
现在,我们算是把壳脱完了。开始修复IAT,让程序运行起来。我们来到IMPREC界面,先设置调整一下选项。如下图:
前面已经说过怎么寻找设置OEP,现在具体讨论如何修复NTDLL.DLL。为了解决跨平台问题,我们需要将所有对NTDLL.DLL的引用替换为kernel32.dll中相同函数的引用。下图展示了如何寻找需要替换的函数引用。
双击其中一项需要替换的函数引用,打开输入表编辑器对话框。我可以在输入表编辑器中进行替换操作。输入表编辑器相对比较智能,支持模糊搜索功能,我们根据同名(或名称相近)替换的原则来做这一步。同时,输入表编辑器还有一个比较智能的特性,如果你修改了多个NTDLL.DLL中的函数引用,那么IMPREC会自动为您完成其余函数的替换工作。如下图演示:
尽量先选择名称相近的函数引用进行替换,如下图:
只改了两个IMPREC就帮我自动替换了其余需要修改的函数引用,如下图:
现在,我们为刚才DUMP出的文件修复IAT。如下图:
修复过程是自动的,完成后会产生一个文件带_符号的新文件。这个新文件就是我们修复好的文件,试试看能不能运行?执行修复好的flywoool_dump_.exe。
哈哈,我们脱壳成功了。不过,这个程序有自校验,所以跑出来这么一个窗口。看看脱壳后的文件大小,居然有7.34 MB。
五、 最终优化
7.34 MB可不是我想要的结果,是应该优化一下了。我做优化不是很在行,很多问题还不懂。在这里我谈一个临时抱佛脚由酷子教给我的方法。
我们在OD中打开刚才修复好的文件,用ATL+M快捷键打开模块对话框,并对所有的区段用F2键设置断点。如下图:
用F9运行程序。程序每调用一个区段会中断一次,当程序完全启动时还没有被调用到的区段就是我们可以删除的区段了。启动后断点情况如下图:
有3个区段(.text1、.data1、.pdate)的断点没有被执行,说明程序一直没有访问它们。它们就是我们将要清理的目标。打开LoadPE启动PE编辑器,编辑区段,如下图:
三个无用区段都按下图的方法清理:
清理完三个区段后,我们需要重建PE结构,优化后的程序才能运行起来。
重建完毕后,我们看看文件的体积现在是多少?2.79 MB!!!
六、 经验总结
终于写完了,累呀!通过这篇文章,我希望同学们可以掌握:
进一步识别壳特性的方法;
脱穿山甲壳的一般方法;
如何利用ArmInline解密穿山甲加壳的文件;
如何修复NTDLL.DLL跨平台障碍;
脱壳后PE文件优化的基本操作。
练习作业:参考本文的方法,利用附带的另一款脚本脱一个穿山甲4.66版加密的UnpakcME,并对脱壳后的文件进行优化。熟悉和掌握手册中讲解的知识。
感谢所有乐于助人的朋友们,感谢所有撰写手册的好心人。=) |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|