Armadillo资料集锦
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)的一块内存,复制下来,并把它粘贴到