前段时间,我对Armadillo壳很感兴趣,于是收集了很多资料,想好好研究一番,
这些文章来自很多站点,感谢:看学论坛,白菜乐园,探索杂志……
最近又看到很多Cracker在对付Armadillo时遇到了麻烦,所以拿到新论坛共享
给大家.
*****************
第一章,大虾们的脱壳文章
*****************
----------------------------------------------------------------------
(1).
----------------------------------------------------------------------
标 题:手動脫殼的方法. (975字)
发信人:1212
时 间:2000-9-17 22:53:30
详细信息:
噫!我以前貼過Armadillo的脫殼方法,怎麼不能舉一反三.
[目標軟體]:VB power wrap V1.7
[保護機制]:Armadillo保護,防Soft-ICE,時間限制.
[使用工具]:1.Trw2000
2.Bw2000
3.Procdump32
4.Regmon
[手動脫殼]:1.第一次執行被Armadillo保護的軟體,Armadillo會在C:\WINDOWS\TEMP\的目錄
下解壓一個Armxxxx.tmp的文件,這是保護系統的dll,程式用它Anti-Debugger,設置時間標誌
等等,並將所取得的環境資訊寫入註冊表中,以供程式比對運用,這個Key的路徑在
HKLM\Software\The Sillicon Realms Toolworks\Armadillo,故若你的軟件試用期已過,你便
需要把這個Key刪除,重新獲得試用。
2.若你有安裝Soft-ICE,須先把它移除,以利作業,首先執行BW2000,按track,再執行vbrap.exe,
首先在BW2000中顯示004085BB,等到NagBox出現,按OK後會再出現一個位址0048535 C這是
VBRAP.tmp0的OEP這才是我們要的。
3.用Trw2000載入vbrap.exe,下faults off,再下G 0048535C等到NagBox出現按OK後程式會中斷
在0048535C,再下makepe(不是很穩定)或下suspend用Procdump32,選VBRAP.tmp0,dump(full),
改OEP等於0008535C即可脫殼.
C-pen 2000\9\17
----------------------------------------------------------------------
(2).
----------------------------------------------------------------------
如何破解由Armadillo 1.8或1.8x保护的程序
程式猎人翻译
工具:
winhex 9.0
w32dasm 8.7 或8.9版本(译者:最好使用8.93 gold版)
不需要其它调试工具或一定不要运行它们。
无论你有无关于这新版本的经验或者没有掌握它,你在这里都可以学习到破解1.8或1.8x
版的知识,你只要认真学习就可以了。
我们要研究的对象是Stay On Pro3.2,如果你没有这个程序,你可以到www.Stayonpro.c
om处查找相应的程序下载。这是一个用于保持网络连接的软件。
在这里我将向大家介绍大部分版本的Armadillo基本保护,而那个软件连接网络的功能对
我们不是很有用的。如果如果你现在空闲没有事情可做的话,就来研究一下Armadillo保护
吧。
开始运行Armadillo保护的程序,通常都会在本地目录下生成一个临时文件(译者:这个
文件在开始时生成,结束时删除),所在目录是程序当前的目录或在一个临时的目录中,这
个文件名为armXXXX.tmp,文件是Armadillo access (security)DLL。当这个文件正在运行
时,就可以被拷贝和汇编。在新的版本中这个文件通常隐藏在user\local seting\temp 目
录中。
由CreateFileA创建的armXXXX.Tmp放在硬盘中并由主程序的LoadLibrary来调用,在Arma
dillo中所有功能好象都是在这里加载到内存中的,以达到提供重要数据的作用。
现在主程序调用解压和解密的函数,在特定的版本中这个函数为GetProgramIinfor,Get
ProgramInfo有检查softice的调试器及其它调试器的功能,这里通常使用以下几个步骤来破
解这个保护的程序。
1 三次调用creatfilea函数,分别使用文件名为"\\.\sice","\\.\ntice" "\\.\sice".(它
是加密的形式)如果它们存在或GetlastError返回值不等于2,则程序标记,将debug旗标设
为true。
2 调用IsDebuggerPresent来检测windows调试器是否存在,对于softice等硬件调试器可以
避开这个功能(译者:这个前后有点错误),如果检测到了,就将debug设true。
3 有的版本,有一个对话框提示用户,如果当前系统中有调试器,就请关闭后重新运行程序
。如果debug的值为true,就出现这个提示窗口。’
4 如果你现在看到“this use a secet key"这通常不是要求一个key,而是删除softice\th
e sililcon的注册键值。当你一步一步跟踪时,程序知道一个debugger在跟踪或程序没有正
确的调用代码出现上述问题。
5 INT3 ,这是最后的保护。在程序中使用一个伪装的中断来阻止程序的运行。有人会说,s
oftice不是不使用INT3,除非你自己设INT3为打开状态吗?错!在softice夸大了这个功能
,而是实际中ebp被设为“BCHK”,不是一个指针,而是实际文本。在softice运行时,它有
一个调用边界检查,对于“BCHK”加载到ebp中断点中(INT3)调用的句柄对softice进行边
界检查,softice不准备放入数据或堆栈也没有准备。为了解决这个保护,你将对IsDebugge
rPresent进行设断,你需要改变这个返回值,它是一个非常好的中断。。按F12从那个函数
返回,再按二次F12跳到原程序中,离开了security(armadillo)DLL,现在按F10(单步)一
段时间,你将达到INT3中断处,ebp初始化后停止,下R ebp=44444444命令,现在就可以按c
trl+d退出ice了,这个目标程序就可以运行了。现在将如何去做呢?如果没有windows 或 s
oftice等调试工具,INT3将产生一个无句柄值,如果有则产生一个有值的句柄。
现在你知道了前面所述,你也不再需要任何上面的知识了(译者:下面方法是太高了,不
用使用softice等调试工具)。你能够使用简单的方法来破解Armadillo程序,它不需要确定
由何版本的Armadilo的加密形式,你将知道你的程序是否用1.8-1.8X加密。然而你需要知道
的是这个程序是由Armadilo保护的。其它有用的信息可以使用GetPrivateProFileString来
获得,它的相关方面可以告诉你其信息。想一想,一些程序员付$89.00来使用这个程序,唯
一可以免费的是工作在silicon Realm Toolwork的人员,现在我们就将完全使用它了。
1 不使用任何调试器(包括softice),开始运行保护的程序。你所需要的文件是你运行的
程序文件名。它由数字和“progname.tmpX"组成。如果你在开始运行“StayOnPro.exe"时,
你可以看到在当前目录中“StayOnPro.tmp()"的文件。使用ctrl+c and ctrl+V来拷贝这个
文件。
2 重命名这个文件为"StayOnPro(undilloed).exe"
3 开始winhex 9.0
4 按ALT+F9开始处理内存部分
5 选拔stayonpro.tmp()为主内存
6 到地址0040000H处,通常这个地址是windows的exe文件开始处。如果你看到MZ字样就找到
了正确的首地址了。
7 现在我们要选择一个大的内存块。先从00400000H处开始到004323D6H处,选择这之间的内
存块。我们去除前面显示00字节的块。通常程序在00400600H或00401000处开始运行程序,
代码段通常在00401000H处开始。你将选择那些除了00块以外的所有块。第二个00字节块开
始于00423D7H,因此我们到达004323D6H,有时代码段从原来的00401000H处移到00400600H
处。Armadillo给出的代码标记是X的地方就为代码段开始的地方。
8 按CTRL+C,拷贝选择的内存块。
9 选择文件/打开选项后选择打开stayonpro(undilloed).exe文件。
10 将指针放在有4D标记的块上,选择编辑/剪粘板数据/写入选项,出现一个对话框显示写
入的偏移量为0时,按ok。
11 保存文件
12 现在stay on pro 就已经被完全解密了。你可以很轻松的对它进行反汇编和追踪了。
13 你需要一个调试器了吗?不需要,说感谢自己吧。
下面是如何破解出Armadillo 1.80-1.8X本身和Armadillo 1.80-1.8X程序。
1 不使用任何调试器(包括softice),开始保护的程序。你所需要的是你运行的程序文件
名。它由数字和“progname.tmpX"组成。如果你在开始运行“Armadillo.exe"时,你可以看
到在当前目录中“Armadillo.tmp()"的文件。使用ctrl+c and ctrl+V来拷贝这个文件。
2 重命名这个文件为"Armadillo(undilloed).exe"
3 开始winhex 9.0
4 按ALT+F9开始处理内存部分
5 选拔Armadillo.tmp()为主内存
6 到地址0040000H处,通常这个地址是windows的exe文件开始处。如果你看到MZ字样就找到
了正确的首地址了。
7 现在我们要选择一个大的内存块。先从显示4D字样的00400000H处开始到0041894bH处,选
择这之间的内存块。
8 按CTRL+C,拷贝选择的内存块
9 选择文件/打开选项后选择打开Armadillo(undilloed).exe文件,
10 将指针放在有4D标记的块上,选择编辑/剪粘板数据/写入选项,出现一个对话框显示写
入的偏移量为0时,按ok。
11 保存文件
12 现在Armadillo 1.8 就已经被完全解密了或者说这个程序已经没有保护了。
13 不幸的运行程序的话将出现错误,为什么吗?程序的头信息已经指向另一个错误的地址
了。我们将如何查找代码位置呢?向下看:
14 现在我们需要w32dasm来攻击它了。
15 反汇编那个前面保存后的Armadillo(undilloed).exe文件。
16现在查找程序开始时的位置。经验告诉我所有windows的程序入口都调用GetCommandLineA
,GetStartupInfoA,GetModuleHandleA,GetVersion和ExitProcess。对于这个程序我们查
找到GetVersion函数。忽略第一个和第二个查找的结果,因为它们仅是import table的映射
,第三个也不是一个正确的,这是一个GetVersionEx,它不是我们要找的。第四个才是正确
的。
17 现在看一下,对于这个函数,我们可以利用一些或所有的功能。这个最象是windows入口
点。
18 下一步将是查找NOP或RET。这个RET的地址为412D3D。这就知道入口值为412D40(译者:
RET为两个字节)。关闭w32dasm。
19 现在就可以处理了。打开winhex,载入armadillo1.8x(unarmed).exe文件。
20 在E0处开始程序头,在108H是入口点(译者:这时是指偏移量)
21 在108H处我们将要写32—bit入口数据。
22 入口点的值为00412d40。减去虚似地址的偏移量就可以得到正确的值。程序在00400000H
处为入口值,因此412d40-400000=12d40。现在就将00012d40替换就可以了。
23 在windows中大的数通常写在后,如:40 2d 01 00。写40H到文件中108H,2D到109H,01
H到10AH处和00H到10BH处。
24 Armadillo 1.8x 或它保护的程序就完全破解了。
25 你需要使用调试器吗?不需要,说谢谢你自己吧。
----------------------------------------------------------------------
(3).
----------------------------------------------------------------------
标 题:关于Armadillo 1.8x-2.x的anti-debug&加壳原理初步探讨和脱壳方法 (12千字)
发信人:leo_cyl1
时 间:2002-4-11 12:14:54
详细信息:
目标软件:Wealth-Lab Developer 2.0
目标文件:WealthLab.exe
加壳方式:Armadillo 1.8x-2.x
使用工具:WinDbg或trw2000, peditor, WinHex 10.2 SR-2,m$的win32 sdk文档
URL: http://www.silicmdr.com/downloads/WealthLabSetup.exe
本文作者:leo_cyl
论题中关于Armadillo 外壳的讨论很少,以前hying曾经写过一些,但很少人能理解,现在就
以Wealth-Lab Developer 2.0为例子初步探讨对付Armadillo 外壳的方法。因为我在xp下没装s-ice
,只有WinDbg可用,所以本文兼做WinDbg的简单教学吧,同时为照顾使用trw2000的朋友,我会列出
等价的trw命令。
Armadillo 外壳反跟踪和反dump挺强的,(至少用procdump不行)。当我们运行
WealthLab.exe后,在Program Files\Wealth-Lab Developer 2.0目录下产生WEALTHLAB.TMP0文件。
这是个不能运行的脱壳文件,也是Armadillo 外壳的至命弱点。
(一)对anti-debug的分析
首先WealthLab.exe通过CreateFileA 产生ArmXXXX.tmp 文件(在window的temp目录)并作为
dll载入,Armadillo的一些重要功能在ArmXXXX.tmp中,它的一个主要引出函数是GetProgramInfo,
作用是un-packing 和 un-encrypting ,还有就是检查系统中有无调试器。
用WinDbg载入WealthLab.exe,因为Armadillo采用seh技术改变程序的流程,所以使用以下命
令“sxd *”就是告诉WinDbg捕获异常后不要处理,有原程序处理,对应trw2000的命令是“faults
off”,另外Armadillo 调用IsDebuggerPresent来判断系统中有无调试器,如果用trw2000,当然检
查不到,但用WinDbg时要下断点“bp IsDebuggerPresent”,然后f5执行……中断后来到这里:
kernel32!IsDebuggerPresent:
77e52e92 64a118000000 mov eax,fs:[00000018]
77e52e98 8b4030 mov eax,[eax+0x30]
77e52e9b 0fb64002 movzx eax,byte ptr [eax+0x2]
77e52e9f c3 ret 《==== eax=1表示系统有调试器,所以将eax改为0
(如果用trw2000,忽略这里)
然后f5执行……中断后来到这里:
04064be 33854cfbffff xor eax,[ebp-0x4b4]
004064c4 8be8 mov ebp,eax
004064c6 b804000000 mov eax,0x4
004064cb cc int 3 〈==== seh技术!
004064cc 8b0dbc574100 mov ecx,[image00400000+0x157bc (004157bc)]
看一下seh链“dd fs:0”最后查到地址40a944。下命令“gn 40a944”(trw2000中要用 INT3HERE
OFF命令,并下断点bpx 40a944)来到这里:
0040a944 55 push ebp
0040a945 8bec mov ebp,esp
0040a947 83ec08 sub esp,0x8
0040a94a 53 push ebx
0040a94b 56 push esi
0040a94c 57 push edi
0040a94d 55 push ebp
0040a94e fc cld
……
……
以上代码产生ArmXXXX.tmp,并获得引出函数地址(在此忽略),执行到00406807 时将调用
GetProgramInfo
004067f6 mov dword ptr [ebp-0x134],0x4157dc
00406800 lea ecx,[ebp-0x154]
00406806 push ecx
00406807 call dword ptr [ebp-0x490]{ARM1!GetProgramInfo (1000b0c0)} 〈=进入
0040680d add esp,0x4
00406810 and eax,0xff
00406815 test eax,eax
00406817 jnz image00400000+0x6823 (00406823)
进入ARM1!GetProgramInfo (1000b0c0)后来到这……
1000913c 8065d800 and byte ptr [ebp-0x28],0x0
10009140 8365fc00 and dword ptr [ebp-0x4],0x0
10009144 0f018dbcfdffff sidt [ebp-0x244] 〈==[ebp-0x244]中防入idt表
1000914b 8b85befdffff mov eax,[ebp-0x242]
10009151 83c008 add eax,0x8 〈=== int2 handle的地址
10009154 8b18 mov ebx,[eax]
10009156 83c010 add eax,0x10 〈===int3 handle的地址
10009159 8b00 mov eax,[eax]
1000915b 25ffff0000 and eax,0xffff
10009160 81e3ffff0000 and ebx,0xffff
10009166 2bc3 sub eax,ebx 〈== int2,3 handle的地址相减
10009168 83f81e cmp eax,0x1e
1000916b 7547 jnz ARM1!ReleaseHook+0x3c5b (100091b4)
1000916d 8b8548fcffff mov eax,[ebp-0x3b8]
10009173 050c010000 add eax,0x10c
这是第二个anti-debug代码,判断int2,3 handle地址的距离,正常的话小于0x1e。如果安装了
int3 handle(某些调试器会)的话,大于0x1e。奇怪的是WinDbg不能走完这段代码,在1000914b
处异常(trw2000就可以)。所以在10009144 处,我把eip改到10009168,并改eax小于0x1e。
f5继续执行,其间在kernel32!IsDebuggerPresent又会中断一次,将返回值改为0;来到这里:
1000b82e push ebx
1000b82f push 0x3
1000b831 push ebx
1000b832 push eax
1000b833 call ARM1!GetProgramInfo+0x8c8 (1000b988)
1000b838 pop ecx
1000b839 push eax
1000b83a call dword ptr [10013048]{kernel32!CreateFileA (77e5a837)}
1000b840 cmp eax,0xffffffff
1000b843 jz ARM1!GetProgramInfo+0x78e (1000b84e)
1000b845 push eax
1000b846 call dword ptr [ARM1!NukeNow+0x6da1 (10013044)]
1000b84c jmp ARM1!GetProgramInfo+0x799 (1000b859)
1000b84e call dword ptr [10013060]{ntdll!RtlGetLastWin32Error}
1000b854 cmp eax,0x2
1000b857 jz ARM1!GetProgramInfo+0x79d (1000b85d)
1000b859 mov byte ptr [ebp-0x1],0x1
eax为"\\.\SICE", "\\.\NTICE", 和 "\\.\SIWDEBUG" ,哈哈,检测s-ice!如果它们存在或
RtlGetLastWin32Error(win98是GetLastError )不等于2,将设立DEBUG 标志。注意这里重复3次
。
以上是anti-debug的分析,对付它的方法大家都知道了吧! :)
(二)脱壳
WealthLab.exe运行后,在工作目录下产生WEALTHLAB.TMP0文件。这是个不能运行的脱壳文件
。把改名为WEAL-NUPACK.exe。用peditor查看,OEP是4086fc。用WinHex 10.2打开,发现从0x400到
0x40400共256k的内容被添入0x58,即 pop eax的机器码。只要找回这部分代码就是完整的脱壳文件
了。但不能用procdump,系统会崩溃,幸好WinHex提供了类似功能。先用peditor的FLC计算器计算
0x400和0x40400的虚拟地址,分别是0x401000,0x441000。
WealthLab.exe运行后,在运行WinHex ,按ALT+F9 开始内存编辑,选WEALTHLAB.TMP0进程,
来到偏移0x401000初,选0x401000到0x441000(共256k)的一块内存,复制下来,并把它粘贴到
WEAL-NUPACK.exe对应的地方(0x400到0x40400共256k)。
到此已经把加壳文件还原了,但还是不能运行!why?呵呵……因为OEP不对嘛!
(三)找OEP
前面两步还挺容易,找OEP却把我难住了,足足花了3个小时才找到。因为外壳和原程序在两个
不同的进程中,地址空间不一样,debug起来有困难,幸好我们知道是外壳产生了原程序的进程,所
以断点CreateProcessA是关键!
从新载入WealthLab.exe,躲过anti-debug,继续从第一步描述的地址开始,下断点“bp
CreateProcessA”,来到这里:
:00408908 6820594100 push 00415920
:0040890D 8D45B8 lea eax, dword ptr [ebp-48]
:00408910 50 push eax
:00408911 6A00 push 00000000
:00408913 6A00 push 00000000
:00408915 6A04 push 00000004
:00408917 6A00 push 00000000
:00408919 6A00 push 00000000
:0040891B 6A00 push 00000000
1 2 下一页 |