飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7571|回复: 10

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

[复制链接]

该用户从未签到

发表于 2005-9-29 09:51:38 | 显示全部楼层 |阅读模式
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:[ebp+10],0
77E6239A     56                push esi
77E6239B     0F84 C2E30100     je kernel32.77E80763
77E623A1     64:A1 18000000    mov eax,dword ptr fs:[18]

看堆栈

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   010476B3  NOTEPAD.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:[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]

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

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

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

00A05A99     8B0D 6C50A300     mov ecx,dword ptr ds:[A3506C]--------回到这里
00A05A9F     89040E            mov dword ptr ds:[esi+ecx],eax
00A05AA2     A1 6C50A300       mov eax,dword ptr ds:[A3506C]
00A05AA7     391C06            cmp dword ptr ds:[esi+eax],ebx
00A05AAA     75 16             jnz short 00A05AC2
00A05AAC     8D85 B4FEFFFF     lea eax,dword ptr ss:[ebp-14C]
00A05AB2     50                push eax
00A05AB3     FF15 B862A200     call dword ptr ds:[A262B8]         
00A05AB9     8B0D 6C50A300     mov ecx,dword ptr ds:[A3506C]
00A05ABF     89040E            mov dword ptr ds:[esi+ecx],eax
00A05AC2     A1 6C50A300       mov eax,dword ptr ds:[A3506C]
00A05AC7     391C06            cmp dword ptr ds:[esi+eax],ebx
00A05ACA <>  0F84 2F010000     je 00A05BFF ------magic jump//修改为:JMP 00A05BFF
00A05AD0     33C9              xor ecx,ecx
00A05AD2     8B07              mov eax,dword ptr ds:[edi]
00A05AD4     3918              cmp dword ptr ds:[eax],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 00007000  NOTEPAD  .text   Imag 01001002  R  RWE 上下内存断点

否则将会出现以下情况:

77F60B6F     56                push esi
77F60B70     FF75 0C           push dword ptr ss:[ebp+C]
77F60B73     8B75 08           mov esi,dword ptr ss:[ebp+8]
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[DFCG]大大的“新手学脱壳 之 Armadillo 3.00a - 3.61 标准壳”后知道,
在将magic jump由 je 00A05BFF修改为JMP 00A05BFF后,Ctrl+F 在当前位置查找命令:
salc 在00A05C16处,当看到jmp、salc、salc代码连在一起时,呵呵,恭喜,
找到地方了,在salc上面的jmp处下断!--------- KuNgBiM[DFCG]大大的原话


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

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

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

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


按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:[100114C]
01006AF5     FFD7              call edi
01006AF7     66:8138 4D5A      cmp word ptr ds:[eax],5A4D
01006AFC     75 1F             jnz short NOTEPAD.01006B1D
01006AFE     8B48 3C           mov ecx,dword ptr ds:[eax+3C]
01006B01     03C8              add ecx,eax
01006B03     8139 50450000     cmp dword ptr ds:[ecx],4550
01006B09     75 12             jnz short NOTEPAD.01006B1D
01006B0B     0FB741 18         movzx eax,word ptr ds:[ecx+18]
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,与正常的大小差不多。





---------------------愿我的所做,给你带来帮助-----------------------------------
PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-4-10 17:02
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2005-10-3 16:01:46 | 显示全部楼层
    强!!学习了!!
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    5 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2005-10-3 16:21:36 | 显示全部楼层
    收下~
    列为精华的说!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-7-9 22:48
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2006-7-21 01:38:52 | 显示全部楼层
    学习.支持LZ
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-2-21 11:01
  • 签到天数: 65 天

    [LV.6]常住居民II

    发表于 2006-7-23 20:20:10 | 显示全部楼层
    上传个记事本给大伙练一下手就更好啦```向LZ学习
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-6-1 19:38:39 | 显示全部楼层
    谢谢支持一下....
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2012-9-1 17:25:28 | 显示全部楼层
    收藏先,好东西
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2023-5-16 11:00
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-11-4 13:55:58 | 显示全部楼层
    谢谢。学习一下
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2019-6-28 19:10
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2015-1-10 20:44:00 | 显示全部楼层
    好强啊。。。收藏学习中。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-22 10:56
  • 签到天数: 167 天

    [LV.7]常住居民III

    发表于 2015-10-30 15:06:08 | 显示全部楼层
    谢谢分享 收藏学习中。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表