首页
社区
课程
招聘
[分享]菜鸟的Armadillo 脱壳笔记一
发表于: 2007-5-8 11:17 8555

[分享]菜鸟的Armadillo 脱壳笔记一

2007-5-8 11:17
8555

这是我的入门级脱壳笔记,贴出来供大家分享

脱壳软件:加壳的记事本

PIED查壳:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks

Armadillo_Find_Protected_v1.3检查
★ 目标为Armadillo保护
★ 特征识别 = FC30D8FC
保护系统级别为 (标准版)
◆所用到的保护模式有◆
屏蔽调试器
双进程模式
【备份密钥设置】
固定的备份密钥
【程序压缩设置】
较好/较慢地压缩方式
【其它保护设置】
★分离子进程★ 
子进程标识号为 : 00000EAC 
入口点为 : 00433999  
原始字节为 : 558B

OD载入,忽略所有异常,隐藏OD。记住入口两个字节55 8B,后面要用到的

00433999 >  55                   push ebp
0043399A    8BEC                 mov ebp,esp
0043399C    6A FF                push -1
0043399E    68 503C4500          push NOTEPAD.00453C50
004339A3    68 80334300          push NOTEPAD.00433380
004339A8    64:A1 00000000       mov eax,dword ptr fs:[0]
004339AE    50                   push eax
004339AF    64:8925 00000000     mov dword ptr fs:[0],esp
004339B6    83EC 58              sub esp,58
004339B9    53                   push ebx

在命令行下断 bp WaitForDebugEvent  F9运行

7C85A480 >  8BFF                 mov edi,edi
7C85A482    55                   push ebp
7C85A483    8BEC                 mov ebp,esp
7C85A485    83EC 68              sub esp,68
7C85A488    56                   push esi
7C85A489    FF75 0C              push dword ptr ss:[ebp+C]
7C85A48C    8D45 F8              lea eax,dword ptr ss:[ebp-8]
7C85A48F    50                   push eax
中断在这里,注意看堆栈窗口

0013DAC0   00423D67   /CALL 到 WaitForDebugEvent 来自 NOTEPAD.00423D61
0013DAC4   0013EB84   |pDebugEvent = 0013EB84  在这里右键——在数据窗口跟随
0013DAC8   000003E8   \Timeout = 1000. ms

取消断点,在命令行下断 bp WriteProcessMemory   F9运行,中断后取消断点。注意看数据窗口

0013EB98  00000000       
0013EB9C  004010CC       NOTEPAD.004010CC   这个地址就是OEP的地址(记录)
0013EBA0  00000002
0013EBA4  00000008
0013EBA8  004010CC       NOTEPAD.004010CC
0013EBAC  004010CC       NOTEPAD.004010CC

记录号OEP地址后,关闭程序。

重新载入程序,忽略所有异常,隐藏OD,在命令行下断 he  WaitForDebugEvent  F9运行

7C85A480 >  8BFF                 mov edi,edi   中断在这里
7C85A482    55                   push ebp
7C85A483    8BEC                 mov ebp,esp

中断后,取消断点,ALT+F9返回

00423D67    85C0                 test eax,eax      返回到这里
00423D69    0F84 9A260000        je NOTEPAD.00426409
00423D6F    60                   pushad
00423D70    33C0                 xor eax,eax

在这里右键——搜索——全部常数——输入FFFFFFF8——确定

一共搜索到8个

在第一个上面双击

004243D6   83C8 F8    or eax,FFFFFFF8   来到这里,向上翻在反汇编栏找到2个cmp
分别在上面加上注释
0042438A    83BD D0F5FFFF 00     cmp dword ptr ss:[ebp-A30],0    ; 1CMP(加的注释)
00424391    0F8C A9020000        jl NOTEPAD.00424640
00424397    8B8D D0F5FFFF        mov ecx,dword ptr ss:[ebp-A30]
0042439D    3B0D E4454500        cmp ecx,dword ptr ds:[4545E4]   ; 2CMP(加的注释)
004243A3    0F8D 97020000        jge NOTEPAD.00424640
004243A9    8B95 44F6FFFF        mov edx,dword ptr ss:[ebp-9BC]
004243AF    81E2 FF000000        and edx,0FF
004243B5    85D2                 test edx,edx
004243B7    0F84 AD000000        je NOTEPAD.0042446A
004243BD    6A 00                push 0
004243BF    8BB5 D0F5FFFF        mov esi,dword ptr ss:[ebp-A30]
004243C5    C1E6 04              shl esi,4
004243C8    8B85 D0F5FFFF        mov eax,dword ptr ss:[ebp-A30]
004243CE    25 07000080          and eax,80000007
004243D3    79 05                jns short NOTEPAD.004243DA
004243D5    48                   dec eax
004243D6    83C8 F8              or eax,FFFFFFF8 

在1CMP处下硬件执行断点,SHIFT+F9运行到这里,运行到这里之后删除断点。此时注

意提示窗口    堆栈 ss:[0013EB70]=00000000  

这里的0013EB70就是1CMP处[ebp-A30]的值。 
注意:[0013EB70]=00000000  等号后面必须等于00000000,如果有些程序这里不是00000000,那么就要修改成00000000(修改方法,在这一行右键——修改数据——将十六进制一栏中改成00000000——确定) 

接下来需要记录几项数据,后面要用到

1.  ICMP处的地址值,即 :0042438A  
2.   [ebp-A30]的值,即:提示窗口中的0013EB70 
3.  ICMP下一行JL的跳转地址值,即:00424640 
4.  2 CMP处  ds:[4545E4]的值

记录好以后,向下翻,经过3个FFFFFFF8之后有一行   test eax,eax

0042445D    25 FF000000          and eax,0FF   在这一行添加代码
00424462    85C0                 test eax,eax   就是这一行

代码
1:inc dword ptr ds:[********]  ********表示的数值是上面记录的第2条
   inc dword ptr ds:[ 0013EB70]
     
2:mov dword ptr ds:[****** +4],1  *******表示上面记录的第4条
   mov dword ptr ds:[4545E4+4],1
3. jmp ********   ********表示上面记录的第1条
jmp 0042438A

在0042445D一行双击,汇编以上3行代码

0042445D    FF05 70EB1300        inc dword ptr ds:[13EB70]
00424463    C705 E8454500 010000>mov dword ptr ds:[4545E8],1
0042446D  ^ E9 18FFFFFF          jmp NOTEPAD.0042438A
00424472    90                   nop
00424473    90                   nop
00424474    90                   nop
00424475    90                   nop

回到1CMP处,在下一行顺着跳转线向下找到它跳转地址即00424640处(记录的第3条)

00424640   /E9 E00F0000          jmp NOTEPAD.00425625 

找到这里,在这里下硬件执行断点,SHIFT+F9运行,运行到这里后取消断点。此时代码已经解压完毕,就在这里脱壳。进程中有2个进程,选择第二个脱壳。

接下来要手动查找IAT,

用LordPE编辑器将脱壳的文件入口点改称10CC (用刚开始找到的OEP值减去基址的值
 004010CC-00400000=10CC)然后点保存——确定

OD载入脱壳的文件

004010CC >  55                 push ebp       入口
004010CD    8BEC               mov ebp,esp
004010CF    83EC 44            sub esp,44
004010D2    56                 push esi
004010D3    FF15 F4734000      call dword ptr ds:[4073F4]  注意这里的4073F4 

在数据窗口CTRL+G——输入4073F4——确定  

(在数据窗口右键——Hex——Hex/ASCII(8字节))然后向上和向下翻找到IAT的起始位置和结束位置
这里的起始位置是004072EC

IAT的结束位置是00407536

RAV=004072EC-00400000=72EC
RAV的大小:00407536-004072EC=24A

OD再如加壳的程序,在命令行下断bp DebugActiveProcess  F9运行

7C85A123 >  8BFF               mov edi,edi     中断在这里
7C85A125    55                 push ebp
7C85A126    8BEC               mov ebp,esp
7C85A128    E8 52570200        call <jmp.&ntdll.DbgUiConnectTo>

此时注意看堆栈窗口

0013DAC4   00423BDB   /CALL 到 DebugActiveProcess 来自 NOTEPAD.00423BD5
0013DAC8   00000F6C   \ProcessId = F6C  (这个值每次载入会变的)

再打开一个OD  点OD的文件-附加——附加F6C这个进程

附加完后 ALT+F9 返回

00433999 >- EB FE              jmp short NOTEPAD.<ModuleEntryP>  返回到这里
0043399B    EC                 in al,dx
0043399C    6A FF              push -1
0043399E    68 503C4500        push NOTEPAD.00453C50
004339A3    68 80334300        push NOTEPAD.00433380
004339A8    64:A1 00000000     mov eax,dword ptr fs:[0]

返回到这里后,将入口处的头两个字节还原成最初记录的EP头两个字节(55  8B)

00433999 >  55                 push ebp
0043399A    8BEC               mov ebp,esp
0043399C    6A FF              push -1
0043399E    68 503C4500        push NOTEPAD.00453C50
004339A3    68 80334300        push NOTEPAD.00433380

在命令行下断 BP OpenMutexA  F9运行

7C80EA1B >  8BFF               mov edi,edi     断在这里
7C80EA1D    55                 push ebp
7C80EA1E    8BEC               mov ebp,esp
7C80EA20    51                 push ecx
7C80EA21    51                 push ecx
7C80EA22    837D 10 00         cmp dword ptr ss:[ebp+10],0

断下来注意堆栈窗口

0013F59C   004155F1   /CALL 到 OpenMutexA 来自 NOTEPAD.004155EB
0013F5A0   001F0001   |Access = 1F0001
0013F5A4   00000000   |Inheritable = FALSE
0013F5A8   0013FBDC   \MutexName = "7A4::DA447D465C"  记住0013FBDC

CTRL+G 输入00401000——确定

00401000    0000               add byte ptr ds:[eax],al
00401002    0000               add byte ptr ds:[eax],al
00401004    0000               add byte ptr ds:[eax],al
00401006    0000               add byte ptr ds:[eax],al
00401008    0000               add byte ptr ds:[eax],al
0040100A    0000               add byte ptr ds:[eax],al
0040100C    0000               add byte ptr ds:[eax],al
0040100E    0000               add byte ptr ds:[eax],al

在这里汇编代码  

00401000    60                 pushad   
00401001    9C                 pushfd
00401002    68 DCFB1300        push 13FBDC ; ASCII "7A4::DA447D465C"
00401007    33C0               xor eax,eax
00401009    50                 push eax
0040100A    50                 push eax
0040100B    E8 2FD9407C        call kernel32.CreateMutexA
00401010    9D                 popfd
00401011    61                 popad
00401012  - E9 04DA407C        jmp kernel32.OpenMutexA

注意00401002行push后面的值就是刚才堆栈窗口记录的值

汇编完毕后在这里右键——此处新建EIP——确定——F9运行

7C80EA1B >  8BFF               mov edi,edi
7C80EA1D    55                 push ebp
7C80EA1E    8BEC               mov ebp,esp
7C80EA20    51                 push ecx
7C80EA21    51                 push ecx

来到刚才的中断点,取消断点。再次CTRL+G 输入00401000——确定

将刚才汇编的代码撤销,然后在命令行下断he GetModuleHandleA   SHIFT+F9运行数次,注意看堆栈寻找适当的返回时机

0013F540   004147ED   /CALL 到 GetModuleHandleA 来自 NOTEPAD.004147E7
0013F544   00000000   \pModule = NULL

0013BF20   00B8C807   /CALL 到 GetModuleHandleA 来自 00B8C801
0013BF24   00B9D6C8   \pModule = "kernel32.dll"
0013BF28   00B9E67C   ASCII "VirtualAlloc"

0013BF20   00B8C824   /CALL 到 GetModuleHandleA 来自 00B8C81E
0013BF24   00B9D6C8   \pModule = "kernel32.dll"
0013BF28   00B9E670   ASCII "VirtualFree"

0013BC98   00B7799B   /CALL 到 GetModuleHandleA 来自 00B77995
0013BC9C   0013BDD4   \pModule = "kernel32.dll"  这一次就是最佳返回时机

取消断点,ALT+F9返回

00B7799B    8B0D E011BA00      mov ecx,dword ptr ds:[BA11E0]  返回到这里
00B779A1    89040E             mov dword ptr ds:[esi+ecx],eax
00B779A4    A1 E011BA00        mov eax,dword ptr ds:[BA11E0]
00B779A9    393C06             cmp dword ptr ds:[esi+eax],edi
00B779AC    75 16              jnz short 00B779C4
00B779AE    8D85 B4FEFFFF      lea eax,dword ptr ss:[ebp-14C]
00B779B4    50                 push eax
00B779B5    FF15 CC80B900     call dword ptr ds:[B980CC]   ; kernel32.LoadLibraryA
00B779BB    8B0D E011BA00      mov ecx,dword ptr ds:[BA11E0]
00B779C1    89040E             mov dword ptr ds:[esi+ecx],eax
00B779C4    A1 E011BA00        mov eax,dword ptr ds:[BA11E0]
00B779C9    393C06             cmp dword ptr ds:[esi+eax],edi
00B779CC    0F84 AD000000      je 00B77A7F  这里就是Magic Jump 将JE改成JMP

改完后顺着这里的跳转线向下来到这里

00B77A7F    83C3 0C            add ebx,0C
00B77A82    83C6 04            add esi,4
00B77A85    397B FC            cmp dword ptr ds:[ebx-4],edi
00B77A88  ^ 0F85 CCFEFFFF      jnz 00B7795A
00B77A8E    EB 03              jmp short 00B77A93  在这里F2下断F9运行到这里
00B77A90    D6                 salc
00B77A91    D6                 salc

运行到这里后取消断点,然后在向上到刚才修改的Magic Jump处将修改撤销

打开内存窗口,在00401000断F2下断,F9运行

004010CC    61                 popad        这里就是OEP
004010CD    80E1 2B            and cl,2B
004010D0    D84F 5B            fmul dword ptr ds:[edi+5B]
004010D3    57                 push edi
004010D4    21FF               and edi,edi
004010D6  ^ 7E E8              jle short NOTEPAD.004010C0
004010D8    34 80              xor al,80
004010DA    FD                 std

在这里打开ImportREC选择子进程进行修复

OEP=10CC  RAV=72EC   大小=24A

剪切无效指针,修复转存文件 OK


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
级别不够不能上传附件,等级别够了把加壳的附件传上去
2007-5-8 11:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我弄来研究研究。。谢谢
2007-5-8 18:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错吗,真行
2007-5-9 15:52
0
雪    币: 242
活跃值: (1664)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
5
这个要支持一下,不错的分析!
2007-5-9 18:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哎,今天想学下破解,结果一下子就碰到了Armadillo4.48,无奈,只好慢慢学了,无奈的是我基本什么基础都没
2007-5-9 20:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cis
7
研究研究。。谢谢
2007-5-10 00:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
到现在还不是很清楚壳的原理,努力学习中.....
2007-5-10 11:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习中~~~好复杂!!
2007-7-23 21:54
0
游客
登录 | 注册 方可回帖
返回
//