windycandy 发表于 2005-9-29 09:51:38

Armadillo v4.2 标准壳-----XP的NOTEPAD脱壳

Armadillo v4.2 标准壳-----XP的NOTEPAD脱壳

【加密保护】:Armadillo V4.2 -> Silicon Realms Toolworks

【调试环境】:WinXP、PEiD、ODbyDYK v1.10、LordPE、ImportREC

【破解目的】:学习手动脱Armadillo壳

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

1.前言

为了学习手动脱Armadillo壳,前些天在Silicon Realms Toolworks官方主叶下载了Armadillo v4.2,随对
XP的NOTEPAD进行标准加壳,用PEiD查了下壳,显示“Armadillo 3.78> Silicon Realms Toolworks”加的
壳,大概是PEID数据还没有更新的缘故吧。参考其他大虾的文章后,脱壳过程很简单,仅以此文送给象我一
样的菜鸟参考,高手则略过。

2.脱壳过程

OD载入程序,老规矩插件隐藏OD,忽略所有异常,再添加以下几个异常C0000005(ACCESS VIOLATION)、C000
001D(ILLEGAL INSTRUCTION)、C000001E(INVALID LOCK SEQUENCE)、C0000096(PRIVILEGED INSTRUCTION)

入口代码:

0105A000 N>60                pushad
0105A001   E8 00000000       call NOTEPAD.0105A006
0105A006   5D                pop ebp
0105A007   50                push eax
0105A008   51                push ecx
0105A009   0FCA            bswap edx
0105A00B   F7D2            not edx
0105A00D   9C                pushfd

下bp OpenMutexA断点shift+F9运行,

77E62391 k>55                push ebp---------中断在这里
77E62392   8BEC            mov ebp,esp
77E62394   51                push ecx
77E62395   51                push ecx
77E62396   837D 10 00      cmp dword ptr ss:,0
77E6239A   56                push esi
77E6239B   0F84 C2E30100   je kernel32.77E80763
77E623A1   64:A1 18000000    mov eax,dword ptr fs:

看堆栈

0006F710   0103229B/CALL 到 OpenMutexA 来自 NOTEPAD.01032295
0006F714   001F0001|Access = 1F0001
0006F718   00000000|Inheritable = FALSE
0006F71C   0006FDA0\MutexName = "52C::DA9EEE0AC4"------注意0006fda0,等下会用到
0006F720   00000004
0006F724   00000000
0006F728   010476B3NOTEPAD.010476B3

Ctrl+G 01001000 键入以下代码:

为什么是Ctrl+G 01001000呢?很多教程里都是Ctrl+G 401000,在本例Ctrl+G 401000是无法写入调式
程序中的,而且401000处有代码(大家可以试一试),那么如何知道是用Ctrl+G 01001000的呢?个人认
为是根据载入口的代码来确定的,形式是入口代码地址的前3位+01000,如本例中的入口代码是:
0105A000 N>60      pushad,取其地址中的前3位010,再加上01000,合起来就是01001000。这样一来
许多教程中的Ctrl+G 401000是入口代码地址为004xxxxx的形式,401000属于取其地址中的前3位010,再
加上01000中入口代码前3位为004的一个特例。



01001000   60                pushad
01001001   9C                pushfd
01001002   68 A0FD0600       push 6FDA0堆栈里看到的值
01001007   33C0            xor eax,eax
01001009   50                push eax
0100100A   50                push eax
0100100B   E8 B5A6E576       call kernel32.CreateMutexA
01001010   9D                popfd
01001011   61                popad
01001012   - E9 7A13E676       jmp kernel32.OpenMutexA
01001017   90                nop


在01001000处新建起源,右键-》此处新建EIP
F9运行,再次中断在OpenMutexA处,取消断点。


再次Ctrl+G 01001000
撤消刚才做的选择,右键-》撤消选择


接着下 bp GetModuleHandleA断点F9运行

77E5AD86 k>837C24 04 00      cmp dword ptr ss:,0----断在这里,取消断点
77E5AD8B   0F84 37010000   je kernel32.77E5AEC8----------在这里重新下断点
77E5AD91   FF7424 04         push dword ptr ss:
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:

按F9运行,注意堆栈
许多高手都点明了返回的时机

0006900C   00A05A99返回到 00A05A99 来自 kernel32.GetModuleHandleA
00069010   0006915CASCII "kernel32.dll"
00069014   0006EA58

看到以上代码时就是返回的时机了,取消断点
CTRL+F9返回壳代码

00A05A99   8B0D 6C50A300   mov ecx,dword ptr ds:--------回到这里
00A05A9F   89040E            mov dword ptr ds:,eax
00A05AA2   A1 6C50A300       mov eax,dword ptr ds:
00A05AA7   391C06            cmp dword ptr ds:,ebx
00A05AAA   75 16             jnz short 00A05AC2
00A05AAC   8D85 B4FEFFFF   lea eax,dword ptr ss:
00A05AB2   50                push eax
00A05AB3   FF15 B862A200   call dword ptr ds:         
00A05AB9   8B0D 6C50A300   mov ecx,dword ptr ds:
00A05ABF   89040E            mov dword ptr ds:,eax
00A05AC2   A1 6C50A300       mov eax,dword ptr ds:
00A05AC7   391C06            cmp dword ptr ds:,ebx
00A05ACA <>0F84 2F010000   je 00A05BFF ------magic jump//修改为:JMP 00A05BFF
00A05AD0   33C9            xor ecx,ecx
00A05AD2   8B07            mov eax,dword ptr ds:
00A05AD4   3918            cmp dword ptr ds:,ebx
00A05AD6   74 06             je short 00A05ADE
00A05AD8   41                inc ecx
00A05AD9   83C0 0C         add eax,0C
00A05ADC   ^ EB F6             jmp short 00A05AD4

将magic jump由 je 00A05BFF修改为JMP 00A05BFF后,
按ALT+M,不能马上在内存映像:

01001000 00007000NOTEPAD.text   Imag 01001002RRWE 上下内存断点

否则将会出现以下情况:

77F60B6F   56                push esi
77F60B70   FF75 0C         push dword ptr ss:
77F60B73   8B75 08         mov esi,dword ptr ss:
77F60B76   56                push esi
77F60B77   E8 AA000000       call ntdll.77F60C26
77F60B7C   84C0            test al,al
77F60B7E   0F85 EB6F0200   jnz ntdll.77F87B6F
77F60B84   53                push ebx
77F60B85   57                push edi

被调式程序无法处理异常。

看了KuNgBiM大大的“新手学脱壳 之 Armadillo 3.00a - 3.61 标准壳”后知道,
在将magic jump由 je 00A05BFF修改为JMP 00A05BFF后,Ctrl+F 在当前位置查找命令:
salc 在00A05C16处,当看到jmp、salc、salc代码连在一起时,呵呵,恭喜,
找到地方了,在salc上面的jmp处下断!--------- KuNgBiM大大的原话


00A05C14    /EB 03             jmp short 00A05C19-----在此下断
00A05C16    |D6                salc-------------------找到这里
00A05C17    |D6                salc

F9运行,断在00A05C14处,现在返回Magic Jump 处,改回原先修改的代码,在 00A05ACA 处
点右键->“撤销选择”即可。

撤消00A05C14处的断点,现在ALT+M在去

01001000 00007000NOTEPAD.text   Imag 01001002RRWE 下内存断点


按F9两次运行后,直接中断在OEP处(一遍红色的海洋)

01006AE0   6A 70             push 70
01006AE2   68 88180001       push NOTEPAD.01001888
01006AE7   E8 BC010000       call NOTEPAD.01006CA8
01006AEC   33DB            xor ebx,ebx
01006AEE   53                push ebx
01006AEF   8B3D 4C110001   mov edi,dword ptr ds:
01006AF5   FFD7            call edi
01006AF7   66:8138 4D5A      cmp word ptr ds:,5A4D
01006AFC   75 1F             jnz short NOTEPAD.01006B1D
01006AFE   8B48 3C         mov ecx,dword ptr ds:
01006B01   03C8            add ecx,eax
01006B03   8139 50450000   cmp dword ptr ds:,4550
01006B09   75 12             jnz short NOTEPAD.01006B1D
01006B0B   0FB741 18         movzx eax,word ptr ds:
01006B0F   3D 0B010000       cmp eax,10B
01006B14   74 1F             je short NOTEPAD.01006B35


用LORD PE将其dump出来,不关OD,用ImportREC 1.6,选择这个程序的进程,把OEP改为6ae0,
点IT AutoSearch,CUT掉无效函数。FixDump,正常运行!正常的NOTEPAD大小为65K,加壳后
为592K,而脱壳修复后则达到784K,所以有必要对修复后的程序进行减肥,可以参考飘云的
《Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks脱壳分析 》,减肥后的NOTEPAD
大小为65.3K,与正常的大小差不多。





---------------------愿我的所做,给你带来帮助-----------------------------------

冷血书生 发表于 2005-10-3 16:01:46

强!!学习了!!

飘云 发表于 2005-10-3 16:21:36

收下~
列为精华的说!

dryzh 发表于 2006-7-21 01:38:52

学习.支持LZ

pepsiguest 发表于 2006-7-23 20:20:10

上传个记事本给大伙练一下手就更好啦```向LZ学习

rainny 发表于 2008-6-1 19:38:39

谢谢支持一下....

djlife520 发表于 2012-9-1 17:25:28

收藏先,好东西

4238500 发表于 2014-11-4 13:55:58

谢谢。学习一下

tengis 发表于 2015-1-10 20:44:00

好强啊。。。收藏学习中。

550 发表于 2015-10-30 15:06:08

谢谢分享 收藏学习中。
页: [1] 2
查看完整版本: Armadillo v4.2 标准壳-----XP的NOTEPAD脱壳