第30课 驯服大鳄鱼Armadillo.docx
《第30课 驯服大鳄鱼Armadillo.docx》由会员分享,可在线阅读,更多相关《第30课 驯服大鳄鱼Armadillo.docx(14页珍藏版)》请在冰点文库上搜索。
第30课驯服大鳄鱼Armadillo
第30课驯服大鳄鱼Armadillo
今天讲解如何脱armadillo(英语的意思是鳄鱼)壳,这个壳是著名的猛壳之一,和大S的asprotect齐名。
软件的网站是
图30-1mm_dillodie程序界面
Armadillo的基础就是单进程标准版(Standard)。
Armadillo很多的花样(也是它的特色),如双进程(就是Debugblocker,一回事)、CopyMemII、Nanomites、ImportElimination、StrategicCodeSplicing等,将花样逐个去掉后,最终还是要回归到单进程标准版。
所以,这节很重要,而且必会,重点掌握。
否则,后面的就免谈了。
很多人,一提到大鳄鱼壳,就非常害怕,特别没有信心,缺乏自信,就被它吓倒了。
其实。
它就像北京世界公园表演的鳄鱼一样,你可以把脖子伸到它的张开的长嘴中怡然自得。
下面将详细地讲解ollydbg手动脱壳armadillo的步骤。
例一UnPackMe_Armadillo4.44.a.exe4.44标准版单进程
第-步:
侦测它的花样所用软件Armadillofindprotected1.3简称ArmaFP。
界面如图30-2:
图30-2ArmaFP程序界面
用它侦测我们的目标程序,侦测结果如图30-3:
图30-3ArmaFP侦测目标程序
可以看到,这个就是标准版的。
第二步:
寻找入口点oep
配置ollydbg,忽略所有一切异常,调试选项如图30-4所示。
IsDebugPresent插件点hide。
图30-4ollydbg调试选项设置
★方法一:
按照前面教程介绍的,代码段内存访问断点法。
不要对我说你不会啊!
我会很失望的。
Alt+M按图30-5对code段下内存访问断点
图30-5内存访问断点
按
按钮,出现异常,shift+F9,停在下面
00CD00818B12movedx,dwordptrds:
[edx]
再按
按钮,停在图30-6所示:
图30-6oep到站
Oep为:
4271B0,记下来,以后要用到。
★★方法二:
CreateThread断点法
重新载入目标程序
命令行插件中输入bpCreateThread回车,断点就设好了。
按一次
按钮
提示异常,shift+F9,停在下面
7C810637kernel32.CreateThread8BFFmovedi,edi
7C81063955pushebp
7C81063A8BECmovebp,esp
再按一次
按钮,如有异常就shift+F9,停在下面,堆栈窗口如图30-7所示:
图30-7堆栈窗口
命令行插件中输入bcCreateThread回车,断点就清除了。
按一次ctrl+F9,来到图30-8所示。
图30-8ctrl+F9就是一个循环圈,向下的第一个retn
按一下F8(或按
)来到图30-9:
图30-9跳出循环,来到这里
按一次ctrl+F9,来到图30-9下方所示的retn那一行,即CBC732行。
按一下F8(或按
)来到下面:
00CCFFF359popecx
00CCFFF4BEE80BCE00movesi,0CE0BE8
00CCFFF98BCEmovecx,esi
00CCFFFBE82C8DFDFFcall00CA8D2C
向下寻找两个离得很近的callecx如图30-10:
图30-10点住CD00F9行按F4
第二个callecx行关键,F4来到后ecx装的值就是oep=4271B0按F7即可(或)进入
和图30-6所示的相同。
这么简单,你学会了吗?
需要说明的是:
armadillo4.xx版关键是这两个callecx;
armadillo3.xx版关键则是一个calledi。
据此,也可以判断你手脱的armadillo的版本。
第三步:
寻找magiccall众里寻他千XX蓦然回首那人却在灯火阑珊处
来到oep后,如图30-6,定位向下的第一个call[××××],如图30-11:
图30-11定位4271D6行,跟随内存窗口
图30-12内存窗口选定黄色所示字节,设硬件写入断点
设好后,重新载入目标程序。
如图30-13:
图30-13重新载入目标程序,这是第二次载入
按一次
按钮,出现异常,shift+F9跳过,来到图30-14
图30-14第一次停在这里
77×××××是通用模块,不是我们所关心的程序自己的领空,继续按一次
按钮,来到图30-15:
图30-15第二次停在这里
有点意思了,向上寻找msvcrt._stricmp,如图30-16所示:
图30-16magiccall所在位置
找到magiccall所在位置后,命令行插件处输入hd回车,弹出如图30-17所示的界面:
图30-17清除原来设置的硬件写入断点
图30-18magiccall所在行设硬件执行断点
第四步:
修改magiccall并来到oep
重新载入程序(这是第三次载入程序),出现异常,shift+F9跳过,来到CCCB0A,按F7键进入此call,如图30-19:
图30-19修改点所在行
修改后如图30-20所示:
图30-20C3伺候
命令行插件处输入hd回车,弹出如图30-21所示的界面:
图30-21清除设置在magiccall行的硬件执行断点
Ctrl+G,填入oep,如图30-22:
图30-22快速定位
点确定后如图30-23,在4271B0行设置硬件执行断点
图30-23oep所在行设硬件执行断点
点
按钮,被断。
命令行插件处输入hd回车,清除原来设置的硬件执行断点
总结:
载入目标程序一次,找到oep;设硬件写入断点,载入目标程序第二次;清断点,找到magiccall,设硬件执行断点,载入目标程序第三次;清断点,修改C3,设oep处的硬件执行断点;清断点,到站。
剩下的就是dump和修复输入表了。
前面的课程已经讲得很多了,此处不详细讲了。
图30-24用lordpe软件dump程序,ollydump插件不行
图30-25选定程序,importreconstructor填好oep,点IATAutoSearch,点Getimports
点ShowInvalid按钮,如图30-26,cut掉无效的指针
图30-26cut掉无效的指针
点FixDump按钮即可。
这时的dumped_.exe已经能完美运行。
脱壳后的程序很大,为1.3M,包含很多的armadillo垃圾代码。
主要是.text1、.adata、.data1和.pdata这四个区段。
如图30-27所示:
图30-27armadillo垃圾区段图示
用lordpe的peeditor,如图30-28,依次删掉4个区段头
图30-28菜单操作示意
点save按钮保存。
Options选项按图30-29设置
图30-29Options菜单选项
如图30-30rebuildPE,变为原来的31%,只有417k。
图30-30图示
此时,用PEiD侦壳脱壳文件会显示“Armadillo 1.xx-2.xx”,用16进制编辑器(WinHex或UltraEdit32)把PE Header+0X1A和0X1B处MajorLinkerVersion、MinorLinkerVersion的53、52清00就行了。
补充:
第2步寻找oep中,还有第3种方法,速度也很快,也很好使,推荐给大家。
Ollydbg载入目标程序
命令行插件中输入bpGetCurrentThreadId[ESP]<10000000回车
F9运行程序,提示异常,shift+F9,跳过
继续F9运行程序,提示异常,shift+F9,跳过,来到堆栈窗口如图30-31所示:
图30-31堆栈窗口
bcGetCurrentThreadId清除断点,alt+F9返回程序领空,如图30-32
图30-32alt+F9返回
按一次ctrl+F9,按一次F8,如图30-33
图30-33
Ctrl+S在当前位置下搜索命令序列:
callecx
movdwordptrss:
[ebp-1c],eax
旧版本是大括号中是ebp-4,如图30-34
图30-34查找快速定位
找到后,点住,按F4,按F7即来到入口点,参看图30-10、图30-6。
最最重要的东西学完了,牛刀小试一把,下面来看双进程(即Debugblocker)。
双进程已经被研究透了,只需写入一些代码即可拆解为单进程。
参见附件的ArmMutex.txt。
也没几行,其实很简单,我们重复地写它也没意思。
载入或运行双进程程序,在lorpe或importreconstructor中可以看到两个一模一样的程序。
用ollyscript插件载入脚本ArmMutex.txt后,再看,只看到一个程序在运行。
变成单进程了,用刚刚学到的蹂躏它吧!
作业运用几种不同方法手脱所附的3个程序并做出动画教程寄给我。