首页
社区
课程
招聘
[求助]Armadillo 2.85 脱壳 精华1-7都没有类似案例
发表于: 2006-12-10 09:48 5208

[求助]Armadillo 2.85 脱壳 精华1-7都没有类似案例

2006-12-10 09:48
5208
【破文标题】:identify! 脱壳+破解   

【参考教程】:

        标 题: 【原创】PowerPoint to Flash 1.6.7 脱壳+破解
        发帖人:KuNgBiM
        时 间: 2005-08-19 16:42
        原文链接:http://bbs.pediy.com/showthread.php?threadid=16342

【破文作者】:mjahuolong

【作者邮箱】:hhl760417@21cn.com

【软件名称】:identify! 4.0

【软件大小】:604k

【软件语言】:英文

【下载地址】:http://nj.onlinedown.net/soft/13656.htm

【软件简介】:利用来电显示功能的modem实现在电脑上来电显示,并可通过查询数据库,显示来电者的姓名等其他信息。

【保护方式】:注册码 + 30天试用限制

【加密保护】:peid查是:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
FI查是:Armadillo 2.85,根据英文网站上介绍的特征码,应该是2.85,搜遍精华1到7,竟然没有一篇关于2.85脱壳的例子。

【编译语言】:

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

【破解日期】:2006-12-09

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

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

―――――――――――――――――――――――――――――――――
【脱壳过程】:

一、准备工作

侦壳:用PEiD查壳,Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks 加壳,打开LordPE看见该程序有2个进程,证明该软件具有双进程特征,下面我们就必须先分离父进程,要程序把自己当成子进程运行。
FI查是:Armadillo 2.85,根据英文网站上介绍的特征码,应该是2.85,搜遍精华1到7,竟然没有一篇关于2.85脱壳的例子。
再用Armadillo find protected 1.3 by vel检测显示:
★ 目标为Armadillo保护
★ 特征识别 = 041C0CD4
保护系统级别为 (标准版)
◆所用到的保护模式有◆
屏蔽调试器
双进程模式
使用 Nanomites 处理模式
【备份密钥设置】
无任何注册表操作
【程序压缩设置】
较好/较慢地压缩方式
【其它保护设置】

―――――――――――――――――――――――――――――――――
二、脱壳

1.分离父进程,使程序把自己当成子进程运行

设置Ollydbg自动隐藏,载入主程序:

004A00B9 >/$  55            push    ebp
004A00BA  |.  8BEC          mov     ebp, esp
004A00BC  |.  6A FF         push    -1
004A00BE  |.  68 68824B00   push    004B8268
004A00C3  |.  68 00FB4900   push    0049FB00                         ;  SE 处理程序安装
004A00C8  |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
004A00CE  |.  50            push    eax
004A00CF  |.  64:8925 00000>mov     dword ptr fs:[0], esp
004A00D6  |.  83EC 58       sub     esp, 58
004A00D9  |.  53            push    ebx
004A00DA  |.  56            push    esi
004A00DB  |.  57            push    edi
004A00DC  |.  8965 E8       mov     dword ptr [ebp-18], esp
004A00DF  |.  FF15 28514B00 call    dword ptr [<&KERNEL32.GetVersion>;  kernel32.GetVersion
004A00E5  |.  33D2          xor     edx, edx                      ;以上和教程一致

命令行下断:BP OpenMutexA 然后F9运行:

77E19E6B >  55              push    ebp              ;注意观察堆栈
77E19E6C    8BEC            mov     ebp, esp
77E19E6E    51              push    ecx
77E19E6F    51              push    ecx
77E19E70    837D 10 00      cmp     dword ptr [ebp+10], 0
77E19E74    56              push    esi
77E19E75  ^ 74 E8           je      short 77E19E5F
77E19E77    FF75 10         push    dword ptr [ebp+10]
77E19E7A    64:8B35 1800000>mov     esi, dword ptr fs:[18]
77E19E81    8D45 F8         lea     eax, dword ptr [ebp-8]    ;以上和教程一致

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

注意看BP OpenMutexA 时的堆栈:

0012F5B8   0049990C  /CALL 到 OpenMutexA 来自 Identify.00499906
0012F5BC   001F0001  |Access = 1F0001
0012F5C0   00000000  |Inheritable = FALSE
0012F5C4   0012FBF8  \MutexName = "120::DAF6C7C6AC"       ;★注意这个地址:0012FBF8,与教程一致

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

在cpu的汇编窗口,Ctrl+G,输入:401000,确定,键入以下代码:

00401000    60              pushad
00401001    9C              pushfd
00401002    68 F8FB1200     push    12FBF8                           ; 堆里看到的值
00401007    33C0            xor     eax, eax
00401009    50              push    eax
0040100A    50              push    eax
0040100B    E8 D9BCA177     call    kernel32.CreateMutexA
00401010    9D              popfd
00401011    61              popad
00401012  - E9 548EA177     jmp     kernel32.OpenMutexA

//简便的方法可以在00401000上点击右键,选择在数据窗口中跟随,光标定位在数据窗口的00401000后的00上,按空格键打开编辑窗口,清除其中的内容

//复制以下二进制代码:60 9C 68 F8 FB 12 00 33 C0 50 50 E8 D9 BC A1 77 9D 61 E9 54 8E A1 77 00

//在编辑窗口最下边的HEX+00框中点击右键选择粘贴

在汇编窗口中的00401000上点击右键,选择:此处为新的EIP,新建起源,

弹出警告对话框:

标题:请确认可疑的EIP
内容:您指定的字节位于任何已知模块的可执行的代码外,无效EIP可能会严重影响调试的程序,您仍想更改EIP吗?
操作:确定

F9运行,
77E19E6B >  55              push    ebp
77E19E6C    8BEC            mov     ebp, esp
77E19E6E    51              push    ecx
77E19E6F    51              push    ecx
77E19E70    837D 10 00      cmp     dword ptr [ebp+10], 0
77E19E74    56              push    esi
77E19E75  ^ 74 E8           je      short 77E19E5F
77E19E77    FF75 10         push    dword ptr [ebp+10]
77E19E7A    64:8B35 1800000>mov     esi, dword ptr fs:[18]
77E19E81    8D45 F8         lea     eax, dword ptr [ebp-8]
77E19E84    50              push    eax
77E19E85    81C6 F80B0000   add     esi, 0BF8
77E19E8B    FF15 9010E177   call    dword ptr [<&ntdll.RtlInitAnsiSt>; ntdll.RtlInitAnsiString
77E19E91    6A 00           push    0
77E19E93    8D45 F8         lea     eax, dword ptr [ebp-8]
77E19E96    50              push    eax
77E19E97    56              push    esi
77E19E98    FF15 8C10E177   call    dword ptr [<&ntdll.RtlAnsiString>; ntdll.RtlAnsiStringToUnicodeString
77E19E9E    85C0            test    eax, eax
77E19EA0    7C 13           jl      short 77E19EB5
堆栈显示:
0012F5B8   0049990C  /CALL 到 OpenMutexA 来自 Identify.00499906
0012F5BC   001F0001  |Access = 1F0001
0012F5C0   00000000  |Inheritable = FALSE
0012F5C4   0012FBF8  \MutexName = "C50::DAF6C7C6AC"
此时Ctrl+G:401000 ,在数据窗口中,鼠标拖动选择刚才修改的范围(颜色为红色),点击右键,选择撤销刚才的修改的代码,使代码还原。
OK,父进程分离完毕!如果没有问题的话应该是这样了[把这段代码以二进制保存起来,下次用时直接粘贴,修改00401002处push的值就OK了。]

2、寻找Magic Jump,避开IAT加密

打开breakpoint窗口,删除以前所有的断点,下断:BP GetModuleHandleA 然后F9运行:

77E12CD1 >  837C24 04 00    cmp     dword ptr [esp+4], 0
77E12CD6    74 18           je      short 77E12CF0
77E12CD8    FF7424 04       push    dword ptr [esp+4]
77E12CDC    E8 92FFFFFF     call    77E12C73
77E12CE1    85C0            test    eax, eax
77E12CE3    74 08           je      short 77E12CED
77E12CE5    FF70 04         push    dword ptr [eax+4]
77E12CE8    E8 77520000     call    GetModuleHandleW
77E12CED    C2 0400         retn    4
77E12CF0    64:A1 18000000  mov     eax, dword ptr fs:[18]
77E12CF6    8B40 30         mov     eax, dword ptr [eax+30]
77E12CF9    8B40 08         mov     eax, dword ptr [eax+8]
77E12CFC  ^ EB EF           jmp     short 77E12CED

多次F9时堆栈依次显示:

0012EDD8   77B96960  /CALL 到 GetModuleHandleA 来自 msvcrt.77B9695A
0012EDDC   77B730F4  \pModule = "kernel32.dll"
***********************************************************************
0012EE18   77B98F12  /CALL 到 GetModuleHandleA 来自 msvcrt.77B98F0C
0012EE1C   77B730F4  \pModule = "kernel32.dll"
***********************************************************************
0012EE14   71B110E9  /CALL 到 GetModuleHandleA 来自 WSOCK32.71B110E3
0012EE18   71B12F8C  \pModule = "kernel32.dll"
***********************************************************************
0012EDE4   4721B072  /CALL 到 GetModuleHandleA 来自 SHELL32.4721B06C
0012EDE8   472319A8  \pModule = "kernel32.dll"
***********************************************************************
0012EDE4   7717999D  /CALL 到 GetModuleHandleA 来自 77179997
0012EDE8   771799D4  \pModule = "kernel32.dll"
***********************************************************************
0012EDE4   7713D3F0  /CALL 到 GetModuleHandleA 来自 OLEAUT32.7713D3EA
0012EDE8   770D41C4  \pModule = "kernel32.dll"
***********************************************************************
0012ECB0   770F0DB2  /CALL 到 GetModuleHandleA 来自 OLEAUT32.770F0DAC
0012ECB4   770D3618  \pModule = "KERNEL32.DLL"
***********************************************************************
0012ECB0   770F0DB2  /CALL 到 GetModuleHandleA 来自 OLEAUT32.770F0DAC
0012ECB4   770D3618  \pModule = "KERNEL32.DLL"
***********************************************************************
0012ECAC   770F0DB2  /CALL 到 GetModuleHandleA 来自 OLEAUT32.770F0DAC
0012ECB0   770D3618  \pModule = "KERNEL32.DLL"
***********************************************************************
0012F570   00498E53  /CALL 到 GetModuleHandleA 来自 Identify.00498E4D
0012F574   00000000  \pModule = NULL                                       ;对比教程这里第一次出现NULL
***********************************************************************
0012DED8   003D471F  /CALL 到 GetModuleHandleA 来自 003D4719
0012DEDC   003ED824  \pModule = "kernel32.dll"
***********************************************************************
0012DED8   003D471F  /CALL 到 GetModuleHandleA 来自 003D4719
0012DEDC   003ED818  \pModule = "user32.dll"                               ;对比教程这里第一次出现user32.dll
***********************************************************************
0012DED8   003D471F  /CALL 到 GetModuleHandleA 来自 003D4719
0012DEDC   003ED808  \pModule = "MSVBVM60.DLL"                             ;对比教程这里出现特别的dll
***********************************************************************
0012D81C   73441BC1  /CALL 到 GetModuleHandleA 来自 73441BBB
0012D820   73443DBC  \pModule = "kernel32.dll"
***********************************************************************
0012D810   73442858  /CALL 到 GetModuleHandleA 来自 73442852
0012D814   73443DE8  \pModule = "KERNEL32"
***********************************************************************
0012D808   73443208  /CALL 到 GetModuleHandleA 来自 73443202
0012D80C   00000000  \pModule = NULL                                       ;对比教程这里第二次出现NULL,应该是在这里Alt+F9返回程序了

73443202    FF15 70104473   call    dword ptr [73441070]                   ; kernel32.GetModuleHandleA
73443208    FF35 D0065573   push    dword ptr [735506D0]                   ;程序返回到这里,下边不仅有很多跳转,还有很多call,怎么寻找magic jump ?
7344320E    A3 D4065573     mov     dword ptr [735506D4], eax
73443213    E8 48000000     call    73443260
73443218    E8 4F000000     call    7344326C
7344321D    85C0            test    eax, eax
7344321F    0F84 71410300   je      73477396
73443225    6A 00           push    0
73443227    6A 00           push    0
73443229    6A 00           push    0
7344322B    FF15 7C104473   call    dword ptr [7344107C]             ; kernel32.HeapCreate
73443231    85C0            test    eax, eax
73443233    A3 C8065573     mov     dword ptr [735506C8], eax
73443238    0F84 58410300   je      73477396
7344323E    68 CC065573     push    735506CC
73443243    6A 01           push    1
73443245    FF15 90194473   call    dword ptr [73441990]             ; ole32.CoGetMalloc

根据坛主的提示,继续进行下去了几步,但是在alt+f9返回程序后,出现了很多call,和教程里显示的内容差别大,如果也是几个跳转的话,应该就可以确定magic jump,但是现在又无法进行下去了!看来照搬其他版本的教程是不可行的,请各位大虾协助阿!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 44229
活跃值: (19950)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
最初由 mjahuolong 发布
在cpu的汇编窗口,Ctrl+G,输入:401000,确定,键入以下代码:

00401000 60 pushad
00401001 9C pushfd
00401002 68 F8FB1200 push 12FBF8 ★ 堆栈里看到的值
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B5A6A577 call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 7A13A677 jmp kernel32.OpenMutexA

//简便的方法可以在00401000上点击右键,选择在数据窗口中跟随,光标定位在数据窗口的00401000后的00上,按空格键打开编辑窗口,清除其中的内容

//复制以下二进制代码:60 9C 68 F8 FB 12 00 33 C0 50 50 E8 B5 A6 A5 77 9D 61 E9 7A 13 A6 77


这里你不要直接抄原文的,因为作者系统和你的可能不同,其call kernel32.CreateMutexA机器码也不同。
你只要在OD里将0040100B这句重新键入call CreateMutexA
2006-12-10 10:28
0
雪    币: 214
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
谢谢坛主提示!没想到坛主是如此关心我们这些个菜鸟!

根据提示又进行了下去几步,但是ALT+F9返回程序后

并没有像教程中出现的有几个跳转可以用来判断

magic jump 的位置,而是有很多的call

请坛主再次指点  :)
2006-12-10 14:14
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
这种壳
要拿到手上才能告诉你什么是正确的什么不正确
2006-12-10 14:21
0
雪    币: 220
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个怎么没有跟教程中的东东呢?那要在那返回呢?
2006-12-15 20:56
0
雪    币: 214
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
哪位大虾可以帮忙写一下该脱壳教程阿?
2006-12-20 11:24
0
雪    币: 102
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7


ARM的不是一个教程能说明。
关系到了单,双标准,以及4个全护,每个的都不一样

学习ARM应该从单开始,一步一步进一个难度,到主页下ARM加壳记事本,再参照脱文一步步来,效果就会显著的多了

个人思路,仅供参考。
2006-12-20 12:19
0
游客
登录 | 注册 方可回帖
返回
//