首页
社区
课程
招聘
[原创]新手学脱壳 之 Armadillo 3.00a - 3.61
发表于: 2005-7-15 21:18 6193

[原创]新手学脱壳 之 Armadillo 3.00a - 3.61

2005-7-15 21:18
6193
【破文标题】:新手学脱壳 之 Armadillo 3.00a - 3.61 标准壳

【破文作者】:KuNgBiM[DFCG]

【作者邮箱】:gb_1227@163.com

【软件名称】:密码字典生成专家 1.0

【软件大小】:436 KB

【软件类别】:国产软件/免费版/字典工具

【整理时间】:2005-07-12

【下载地址】:[本地下载]

【软件简介】:该工具能在很短的时间内,产生包含成千上万个密码的字典文件,字符可自定义添加。方便密码的猜测与破解,请合法使用!

【加密保护】:Armadillo 3.00a - 3.61 -> Silicon Realms Toolworks

【编译语言】:Microsoft Visual C++ 5.0

【调试环境】:WinXP、PEiD、Ollydbg、LordPE、ImportREC

【破解日期】:2005-07-14

【破解目的】:推广使用Ollydbg手动脱壳

【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

―――――――――――――――――――――――――――――――――
1.前言

    为了练习算法分析以及脱壳,前一段时间从网上下了一个软件,本来说主要是研究它的注册算法的,不过看了看,结果偶下的是一款免费的软件,倒。。。。正在郁闷ing。。。用PEiD查了下壳,没想到是“Armadillo 3.00a - 3.61 -> Silicon Realms Toolworks”所加壳,兴奋不已,哈哈~~~终于找到个是使用Armadillo加壳的软件(不想找它的时候,它偏偏要来;想找它的时候却又偏偏不来),以前参考过很多fly、jingulong、fxyang、loveboom等大虾们的文章,然后自己这次也该试试脱壳了,为了使象我一样初学脱猛壳者不要重蹈覆辙,我决定详细的写一写,也许高手们认为很简单,那么请略过。

2.脱壳过程(分以下几步进行)

设置Ollydbg忽略所有的异常选项,同时忽略C000001E (INVALID LOCK SEQUENCE)异常范围,用IsDebugPresent 1.4插件去掉Ollydbg的调试器标志。

00435000 >  60              pushad                                 ;  载入程序后停在这里
00435001    E8 00000000     call MakeDict.00435006
00435006    5D              pop ebp
00435007    50              push eax
00435008    51              push ecx
00435009    EB 0F           jmp short MakeDict.0043501A

一、由于该程序使用的是单进程加密的,所以不用使程序把自己当成子进程运行,因此第一步跳过了

二、避开IAT加密

下断:He GetModuleHandleA,F9运行:

77E5AD86 >  837C24 04 00    cmp dword ptr ss:[esp+4],0             ;  断在这,注意看堆栈
77E5AD8B    0F84 37010000   je kernel32.77E5AEC8
77E5AD91    FF7424 04       push dword ptr ss:[esp+4]
77E5AD95    E8 F8050000     call kernel32.77E5B392
77E5AD9A    85C0            test eax,eax
77E5AD9C    74 08           je short kernel32.77E5ADA6
77E5AD9E    FF70 04         push dword ptr ds:[eax+4]

在 77E5AD86 处共中断12次,然后Alt+F9返回程序,判断的时机很容易把握,很多高手都点明了^_^

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

00B7EF70   00D3A980  /CALL 到 GetModuleHandleA 来自 msctfime.00D3A97A     ;第一次
00B7EF74   00B7EF78  \pModule = "C:\WINDOWS\System32\ntdll.dll"

0012BAE8   00C3F686  /CALL 到 GetModuleHandleA 来自 00C3F680         ;第二次
0012BAEC   00C50B58  \pModule = "kernel32.dll"
0012BAF0   00C51BB4  ASCII "VirtualAlloc"

0012BAE8   00C3F6A3  /CALL 到 GetModuleHandleA 来自 00C3F69D         ;第三次
0012BAEC   00C50B58  \pModule = "kernel32.dll"
0012BAF0   00C51BA8  ASCII "VirtualFree"

0012B860   00C297CD  /CALL 到 GetModuleHandleA 来自 00C297C7         ;第四次
0012B864   0012B99C  \pModule = "kernel32.dll"

0012B860   00C297CD  /CALL 到 GetModuleHandleA 来自 00C297C7         ;第五次
0012B864   0012B99C  \pModule = "user32.dll"

0012B860   00C297CD  /CALL 到 GetModuleHandleA 来自 00C297C7         ;第六次
0012B864   0012B99C  \pModule = "MSVBVM60.DLL"

0012B14C   66001BC5  /CALL 到 GetModuleHandleA 来自 66001BBF         ;第七次
0012B150   6600F4D0  \pModule = "kernel32.dll"

0012B140   6600281E  /CALL 到 GetModuleHandleA 来自 66002818         ;第八次
0012B144   6600F4FC  \pModule = "KERNEL32"

0012B138   660031CE  /CALL 到 GetModuleHandleA 来自 660031C8         ;第九次
0012B13C   00000000  \pModule = NULL

0012B860   00C297CD  /CALL 到 GetModuleHandleA 来自 00C297C7         ; 第十次(加载运行函数过程)
0012B864   0012B99C  \pModule = "advapi32.dll"

0012BAEC   00C4444A  /CALL 到 GetModuleHandleA 来自 00C44444         ; 第十一次(注意观察寄存器变化,别犹豫了,返回的好时机,GO!)
0012BAF0   00000000  \pModule = NULL

///////////////// 寄存器 /////////////////

EAX 73D30000 offset MFC42.#1340
ECX 73D30000 offset MFC42.#1340
EDX 00000000
EBX 1C490012
ESP 0012BAEC
EBP 0012ED3C
ESI ED3C0000
EDI 0012D1E0
EIP 77E5AD86 kernel32.GetModuleHandleA

//////////////////////////////////////////

(注意:在第四次F9运行时,程序EIP异常,不管,强行Shift + F9跳过运行!)

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

00C44442    6A 00           push 0
00C44444    FF15 C8B0C400   call dword ptr ds:[C4B0C8]                  ; kernel32.GetModuleHandleA
00C4444A    3985 B8E4FFFF   cmp dword ptr ss:[ebp-1B48],eax             ; MakeDict.00400000   //返回到这里
00C44450    75 0F           jnz short 00C44461
00C44452    C785 B4E4FFFF 9>mov dword ptr ss:[ebp-1B4C],0C4F998
00C4445C    E9 C4000000     jmp 00C44525
00C44461    83A5 90E2FFFF 0>and dword ptr ss:[ebp-1D70],0
00C44468    C785 8CE2FFFF C>mov dword ptr ss:[ebp-1D74],0C4FFC0
00C44472    EB 1C           jmp short 00C44490
00C44474    8B85 8CE2FFFF   mov eax,dword ptr ss:[ebp-1D74]
00C4447A    83C0 0C         add eax,0C
00C4447D    8985 8CE2FFFF   mov dword ptr ss:[ebp-1D74],eax
00C44483    8B85 90E2FFFF   mov eax,dword ptr ss:[ebp-1D70]
00C44489    40              inc eax
00C4448A    8985 90E2FFFF   mov dword ptr ss:[ebp-1D70],eax
00C44490    8B85 8CE2FFFF   mov eax,dword ptr ss:[ebp-1D74]
00C44496    8338 00         cmp dword ptr ds:[eax],0
00C44499    0F84 86000000   je 00C44525                                 ; 这里就是大虾们常说的Magic Jump,把它改为JMP
00C4449F    8B85 8CE2FFFF   mov eax,dword ptr ss:[ebp-1D74]
00C444A5    8B40 08         mov eax,dword ptr ds:[eax+8]
00C444A8    83E0 01         and eax,1
00C444AB    85C0            test eax,eax

(注意:程序Alt+F9返回后,取消所有的断点!)
===============================================================================================

找到Magic Jump ,只要将je改为jmp,就能得到正确的输入表:

00C44499    0F84 86000000   je 00C44525                      ; 原来的代码

改为:

00C44499    E9 87000000     jmp 00C44525                     ; 修改后的Magic Jump
00C4449E    90              nop

(注意:在脱Armadillo 3.0以上的壳时如果直接改为JMP,程序会异常出错!Armadillo旧版可以直接改的。)

===============================================================================================

用 Ctrl+F 在当前位置查找命令:salc 在00C44B61处,当看到jmp、salc、salc代码连在一起时,呵呵,恭喜,找到地方了,在salc上面的jmp处下断!

00C44B39    8B85 60E1FFFF   mov eax,dword ptr ss:[ebp-1EA0]
00C44B3F    8B8D F0E6FFFF   mov ecx,dword ptr ss:[ebp-1910]
00C44B45    8B95 64E1FFFF   mov edx,dword ptr ss:[ebp-1E9C]
00C44B4B    891481          mov dword ptr ds:[ecx+eax*4],edx
00C44B4E  ^ E9 47FFFFFF     jmp 00C44A9A
00C44B53    FFB5 50E8FFFF   push dword ptr ss:[ebp-17B0]
00C44B59    E8 86C7FDFF     call 00C212E4
00C44B5E    59              pop ecx
00C44B5F    EB 03           jmp short 00C44B64               ; 此处下断
00C44B61    D6              salc
00C44B62    D6              salc

F9运行,断在 00C44B5F 处。当然,由于是动态解码,每次调试看到的地址可能是不同的,但代码是相同的!其实断在 00C44B5F 处时,IAT解密已经完成了。现在我们返回Magic Jump 处,改回原先修改的代码,在 00C44499 处点右键->“撤销选择”即可。

取消以前的所有断点。现在就可以在401000段下内存断点了,爽!

三、寻找真正的OEP

脱Armadillo的壳文章,已经有很多人高手写过了,所以这文章的重点在于大家以后能对Armadillo壳有更深的了解。

『用内存断点大法直抵OEP』

用 Alt+M 查看内存映射,在401000开始的段上,下内存访问断点,F9运行。

////////////////////////////////

内存映射,项目 23
地址=00401000
大小=00002000 (8192.)
物主=MakeDict 00400000
区段=.text
类型=Imag 01001002
访问=R
初始访问=RWE

///////////////////////////////

F9运行后,直接中断在OEP处:

00402600    55              push ebp                                    ; 在这儿用LordPE纠正ImageSize后完全DUMP这个进程
00402601    8BEC            mov ebp,esp
00402603    6A FF           push -1
00402605    68 F8354000     push MakeDict.004035F8
0040260A    68 00284000     push MakeDict.00402800                      ; jmp to msvcrt._except_handler3
0040260F    64:A1 00000000  mov eax,dword ptr fs:[0]
00402615    50              push eax
00402616    64:8925 0000000>mov dword ptr fs:[0],esp
0040261D    83C4 98         add esp,-68
00402620    53              push ebx
00402621    56              push esi
00402622    57              push edi
00402623    8965 E8         mov dword ptr ss:[ebp-18],esp
00402626    C745 FC 0000000>mov dword ptr ss:[ebp-4],0
0040262D    6A 02           push 2
0040262F    FF15 E0314000   call dword ptr ds:[4031E0]                  ; msvcrt.__set_app_type
00402635    83C4 04         add esp,4
00402638    C705 20424000 F>mov dword ptr ds:[404220],-1
00402642    C705 24424000 F>mov dword ptr ds:[404224],-1
0040264C    FF15 DC314000   call dword ptr ds:[4031DC]                  ; msvcrt.__p__fmode

三、脱壳修复

运行ImportREC 1.6,选择这个程序的进程,把OEP改为00002600,点IT AutoSearch,CUT掉无效函数。FixDump,正常运行!

〓本文完〓

版权所有(C)2005 KuNgBiM[DFCG]         Copyright (C) 2005 KuNgBiM[DFCG]

--------------------------------------------------------------------------
          Cracked By KuNgBiM[DFCG]

                2005-07-14
               18:36:36 PM

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
2
问题已经解决! 感谢fly兄
2005-7-15 21:20
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
3
试试PETools->PE Ediotr
修改Major Linker Version、Minor Linker Version为05、0C
2005-7-15 21:34
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
4
最初由 fly 发布
试试PETools->PE Ediotr
修改Major Linker Version、Minor Linker Version为05、0C


谢谢fly兄,我在你的论坛看到了!
2005-7-15 22:17
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
学习并支持!
2005-7-18 00:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持看雪
支持好贴
2005-7-18 11:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主,你提供的文件中脱壳后的程序能运行吗?我怎么点击它没有反应啊?感觉楼主脱的过程有点问题,自己又脱了一下,总算可以运行了。arm这个鬼东西还真的很难对付,我又找到几个软件脱了一下,基本上成功。最奇怪的是,有个软件,一定要在“属性”-“兼容性”中将“禁用视觉模式”及“为这个程序关闭高级文字服务”这两项都勾上才能正常运行(带壳的不需要),真的是怪了。
2005-7-19 22:50
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 KuNgBiM 发布
【破文标题】:新手学脱壳 之 Armadillo 3.00a - 3.61 标准壳

【破文作者】:KuNgBiM[DFCG]

【作者邮箱】:gb_1227@163.com
........


如果能再来一篇这版本的双进程序加壳就好了,我到现在还没搞好VB编写的脱壳,总是修复不了表.
2005-7-20 16:52
0
雪    币: 224
活跃值: (75)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
找到Magic Jump ,只要将je改为jmp,就能得到正确的输入表:

00C44499    0F84 86000000   je 00C44525                      ; 原来的代码

改为:

00C44499    E9 87000000     jmp 00C44525                     ; 修改后的Magic Jump
00C4449E    90              nop

(注意:在脱Armadillo 3.0以上的壳时如果直接改为JMP,程序会异常出错!Armadillo旧版可以直接改的。)

那Armadillo 3.0以上以上的怎么改阿? 我照着脱例子在
401000段下内存断点 后F9               
老是程序异常退出
OS:WinXp 没有任何补丁的
2005-8-19 14:35
0
游客
登录 | 注册 方可回帖
返回
//