一起来手脱穿山甲4.x
首先申明这不是我的原创,我只是在学习过程中对网上的方法反复实践后加以自己的理解和感受,希望可以帮助各位新手朋友更好的去理解和吸收。这是我来到吾爱发表的第二篇帖子,加入吾爱也没怎么活跃,多数时间都用到看教程和实践去了,天天泡在论坛也没多大作用,所以没怎么上。希望管理大大高抬贵手别看我没怎么活跃就把我ID给卡擦了~
新手朋友要学习,最好也找系列教程看。网上到处找这样破解教程那样破解教程脱这样壳那样壳的感觉实在学不到什么东西。这里我推荐两个比较好的教程:
[*]黑鹰破解教程 这个有五十多节课,详细讲解了很多壳的脱法和拓展思路
[*]天草破解全集 这个课程比较多,其中分为初级班,中级班,高级班。实实在在的从基础开始讲解,相信很多和我一样没基础的朋友看完也可以有很大的收获。看教程不是去取鱼,而是取“渔”。
我看教程之前,喜欢先把附件提取出来自己先搞一下,一种方法完成了看看有没有另外的方法可以达到相同的效果。要是自己是在是没办法去完成,可以看看教程中的破文,看看是不是需要什么特殊的断点,或者特别注意的函数。破文里面提到的函数也别去复制粘贴,因为我们看教程的目的是学会并吸收这一知识,而不是单单去脱掉这个壳或者破解这个软件。复制一次粘贴一次当然可以达到这个目的,但是你真的记住了吗?下次遇到相同的壳你能准确下断吗?所以把这些东西反复输入,真正记住才是我们要去做到的东西。
好了开始进入正题。
转一点对穿山甲的概述:
遇到过Armadillo的朋友应该知道,它是有点变态的。。中文意思“穿山甲”,可想而知,是很难脱的。
首先介绍一下Armadillo的一些版本以及保护方式、线程情况吧
A:版本
1.xx--2.xx
3.0a--3.61
3.75
3.78
4.x
B:保护方式
标准方式
非标准方式======>Armadillo CopyMem-ll +Debug-Blocker
C:线程
单线程
双线程
上面三种特征都可以两两组合,或者是三三组合。
我们先用PEID查壳,得到的结果是:Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks
[*]载入OD,设置调试选项的”异常“选项卡,勾选所有异常选项,并且添加”C000001E,E06D7363“这两个异常,不然调试的时候是跳不过去的。
[*]用插件隐藏OD。
[*]因为这个壳是个双线程的壳,会阻止调试器,所以我们在命令窗口输入:bp OpenMutexA————回车键,来把它作为一个合法的子进程。
F9,如果前面准备工作做完应该是来到这么一个位置的附近。7C80EABB > 8BFF mov edi,edi
7C80EABD 55 push ebp
7C80EABE 8BEC mov ebp,esp
7C80EAC0 51 push ecx
7C80EAC1 51 push ecx
7C80EAC2 837D 10 00 cmp dword ptr ss:,0x0
7C80EAC6 56 push esi
7C80EAC7 0F84 A7550300 je kernel32.7C844074
7C80EACD 64:A1 18000000 mov eax,dword ptr fs:
7C80EAD3 FF75 10 push dword ptr ss:
7C80EAD6 8DB0 F80B0000 lea esi,dword ptr ds:
7C80EADC 8D45 F8 lea eax,dword ptr ss:
7C80EADF 50 push eax4.我们在这里不要删除断点,跳转(Ctrl+G)来到00401000,这个时候这里是一片空数据。我们注意堆栈窗口,代码如下:0012F710 007EF29B/CALL 到 OpenMutexA 来自 FlyWoool.007EF295
0012F714 001F0001|Access = 1F0001
0012F718 00000000|Inheritable = FALSE
0012F71C 0012FDA0\MutexName = "FE0::DA47D45903"
5.我们在00401000这里开始输入以下指令并且将”用NOP填充“勾上:pushad
pushfd
push 0012FDA0 //这里的地址是我们堆栈里”MutexName“一项前面的地址,自己看下就明白了
xor eax,eax
push eax
push eax
call kernel32.CreateMutexA
popfd
popad
jmp kernel32.OpenMutexA6.输入完以后,我们选上刚刚添加的这一段指令,右键——”此处新建EIP“,F9执行。再次来到7C80EABB >8BFF mov edi,edi
7C80EABD 55 push ebp
7C80EABE 8BEC mov ebp,esp
7C80EAC0 51 push ecx
7C80EAC1 51 push ecx
7C80EAC2 837D 10 00 cmp dword ptr ss:,0x0
7C80EAC6 56 push esi
7C80EAC7 0F84 A7550300 je kernel32.7C844074
7C80EACD 64:A1 18000000mov eax,dword ptr fs:
7C80EAD3 FF75 10 push dword ptr ss:
7C80EAD6 8DB0 F80B0000 lea esi,dword ptr ds:
7C80EADC 8D45 F8 lea eax,dword ptr ss:
7C80EADF 50 push eax
这个地方断下,此时我们的OpenMutexA断点任务就完成了,取消断点再次来到00401000把刚才添加的指令撤销掉,也就是还原成空数据。为什么要这样做?这里也引用原文的一段话好了。
为何要这样做?我发现程序在下面会依据原先的代码进行解码,
以前下 硬件断点 操作没有修改原代码,所以解码正确。
而直接修改Magic Jump后改变了原先的代码,导致解码不正确而异常出错!
现在我们在解码以前恢复原先的代码,因此就不会再出错了!7.添加下一个断点:he OutputDebugStringA ,下好断点后F9运行,来到此处,这里我上个图。
可以看到很多奇怪的字符串%s
我们把数据窗口设置为”长型“—”地址“
我们在堆栈的那一串%s上面右键——在数据窗口跟随。
我们来到数据窗口,在第一个地址上面右键— 二进制—使用00填充
F9运行,再次重复刚才的操作。
两次00填充数据窗口的第一个地址后,我们这个断点的工作也完成了,取消硬件断点。
8.取消上一个断点后,接下来的一个断点是:he GetModuleHandleA+5
下好断点,F9寻找最佳返回时机可以到达magic jump,什么时候是最佳返回时机?我们注意堆栈。过了
001292A8 |010C6AC2 返回到 010C6AC2 来自 kernel32.GetModuleHandleA
001292AC |010DBD6C ASCII "kernel32.dll"
001292B0 |010DDDAC ASCII "VirtualAlloc" //注意这里
来到的地方是
001292A8|010C6ADF返回到 010C6ADF 来自 kernel32.GetModuleHandleA
001292AC|010DBD6CASCII "kernel32.dll"
001292B0|010DDDA0ASCII "VirtualFree"这两个函数连续出现的下一次F9断下的地方0012900C|010B5A99返回到 010B5A99 来自 kernel32.GetModuleHandleA
00129010|0012915CASCII "kernel32.dll"
这里就是最佳返回时机,此处我们取消硬件断点,ALT+F9返回。
来到这里:<blockquote><blockquote>010B5A99 8B0D 6C500E01 mov ecx, dword ptr ds:此处我已经注明了Magic Jump,至于怎么找呢?我们只要找到这附近跳转跨度很大的一个JE就可以确定下了。
修改JE为JMP,在我们修改的Magic Jump上面跟随下来,找到下面的010B5C14 /EB 03 jmp short 010B5C19
010B5C16 |D6 salc
010B5C17 |D6 salc
在两个Salc的上一个地址下”硬件执行断点“,这里也就是0010B5C14这个地址。
F9执行到我们下的断点这里。到了这里断下以后,取消硬件断点,特别注意的是我们还要回到上面的Magic Jump的地址,撤销所选地址修改将代码还原,原因我上面也已经标注了,忘记的可以上翻看下,要真正的理解到脑子里。
9.确定上一个硬件断点已经取消掉以后,我们ALT+M打开内存镜像,在00401000上面下断,shift+F9运行,来到此处。010D0324 8B0C3A mov ecx, dword ptr ds:
010D0327 5B pop ebx
010D0328 03D7 add edx, edi
010D032A A1 A4100E01 mov eax, dword ptr ds:
010D032F 3148 70 xor dword ptr ds:, ecx
010D0332 A1 A4100E01 mov eax, dword ptr ds:
010D0337 3148 70 xor dword ptr ds:, ecx
010D033A A1 A4100E01 mov eax, dword ptr ds:
010D033F 8B16 mov edx, dword ptr ds:
010D0341 8B88 84000000 mov ecx, dword ptr ds:
010D0347 3348 60 xor ecx, dword ptr ds:
010D034A 3348 34 xor ecx, dword ptr ds:
010D034D 030D BC100E01 add ecx, dword ptr ds: ; FlyWoool.00400000
010D0353 85D2 test edx, edx
010D0355 75 1E jnz short 010D0375
010D0357 8B90 88000000 mov edx, dword ptr ds:
010D035D FF76 18 push dword ptr ds:
010D0360 3390 84000000 xor edx, dword ptr ds:
010D0366 FF76 14 push dword ptr ds:
010D0369 3350 40 xor edx, dword ptr ds:
010D036C FF76 10 push dword ptr ds:
010D036F 2BCA sub ecx, edx
来到此处我们离胜利就不远了,F8单步走,直到CALL ECX,F7跟进。
呵呵到达OEP了,因为解密的原因所以OEP是红色的,正常情况不用怕。打开LordPE脱壳把。
纠正镜像大小—完整脱壳。
脱壳完毕后我们打开Import REC进行修复。
填入OEP地址”B79A6“,我们OD里面的地址是加了基址00400000的,所以我们在Import REC里面填入OEP地址应该是004B79A6 - 00400000 = B79A6
填好OEP——自动查找IAT(IAT AutoSearch)——获取资源(Get Imports)——显示无效(ShowInvald)
这里我们不用什么等级去修复,直接剪切(cut thunk(s))——修复(Fix Dump)——选择刚刚我们LordPE保存下的文件
完成后查壳
已经脱掉,然后运行也是没问题的。
OK就到这里了~谢谢阅读~给分给分{:301_975:} Sound 发表于 2012-7-19 16:27 static/image/common/back.gif
穿山甲还是不错的.
楼主的签名图好霸气 看的很眼熟
{:301_1000:}眼熟就对了 穿山甲还是不错的.
楼主的签名图好霸气 看的很眼熟{:1_907:} 奇怪啊,为什么三人行(天草)不在论坛呢 穿山甲 版本诡异 Stimulants 发表于 2013-7-24 14:03 static/image/common/back.gif
奇怪啊,为什么三人行(天草)不在论坛呢
{:1_905:} 穿山甲很经典,还继续更新。 很不错的脱文。收藏学习了,等会去试验下 好牛啊 看了就不敢动了 呵呵呵,这就是三人行的啊。。。。。
页:
[1]
2