【破文标题】:新手学脱壳 之 Armadillo 3.00a - 3.61 标准壳
【破文作者】:KuNgBiM[DFCG]
【作者邮箱】:gb_1227@163.com
【软件名称】:密码字典生成专家 1.0
【软件大小】:436 KB
【软件类别】:国产软件/免费版/字典工具
【整理时间】:2005-07-12
【下载地址】:[本地下载]
【软件简介】:该工具能在很短的时间内,产生包含成千上万个密码的字典文件,字符可自定义添加。方便密码的猜测与破解,请合法使用!
【加密保护】:Armadillo 3.00a - 3.61 -> Silicon Realms Toolworks
【编译语言】:Microsoft Visual C++ 5.0
【调试环境】:WinXP、PEiD、Ollydbg、LordPE、ImportREC
【破解日期】:2005-07-14
【破解目的】:推广使用Ollydbg手动脱壳
【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
―――――――――――――――――――――――――――――――――
1.
前言
为了练习算法分析以及脱壳,前一段时间从网上下了一个软件,本来说主要是研究它的注册算法的,不过看了看,结果偶下的是一款免费的软件,倒。。。。正在郁闷ing。。。用PEiD查了下壳,没想到是“Armadillo 3.00a - 3.61 -> Silicon Realms Toolworks”所加壳,兴奋不已,哈哈~~~终于找到个是使用Armadillo加壳的软件(不想找它的时候,它偏偏要来;想找它的时候却又偏偏不来),以前参考过很多fly、jingulong、fxyang、loveboom等大虾们的文章,然后自己这次也该试试脱壳了,为了使象我一样初学脱猛壳者不要重蹈覆辙,我决定详细的写一写,也许高手们认为很简单,那么请略过。
2.
脱壳过程(分以下几步进行)
设置Ollydbg忽略所有的异常选项,同时忽略C000001E (INVALID LOCK SEQUENCE)异常范围,用IsDebugPresent 1.4插件去掉Ollydbg的调试器标志。
00435000 > 60
pushad ; 载入程序后停在这里
00435001 E8 00000000
call MakeDict.00435006
00435006 5D
pop ebp
00435007 50
push eax
00435008 51
push ecx
00435009 EB 0F
jmp short MakeDict.0043501A
一、由于该程序使用的是单进程加密的,所以不用使程序把自己当成子进程运行,因此第一步跳过了
二、避开IAT加密
下断:He GetModuleHandleA,F9运行:
77E5AD86 > 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]
在 77E5AD86 处共中断12次,然后Alt+F9返回程序,判断的时机很容易把握,很多高手都点明了^_^
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
00B7EF70 00D3A980 /
CALL 到 GetModuleHandleA 来自 msctfime.00D3A97A ;第一次
00B7EF74 00B7EF78 \pModule =
"C:\WINDOWS\System32\ntdll.dll"
0012BAE8 00C3F686 /
CALL 到 GetModuleHandleA 来自 00C3F680 ;第二次
0012BAEC 00C50B58 \pModule =
"kernel32.dll"
0012BAF0 00C51BB4 ASCII
"VirtualAlloc"
0012BAE8 00C3F6A3 /
CALL 到 GetModuleHandleA 来自 00C3F69D ;第三次
0012BAEC 00C50B58 \pModule =
"kernel32.dll"
0012BAF0 00C51BA8 ASCII
"VirtualFree"
0012B860 00C297CD /
CALL 到 GetModuleHandleA 来自 00C297C7 ;第四次
0012B864 0012B99C \pModule =
"kernel32.dll"
0012B860 00C297CD /
CALL 到 GetModuleHandleA 来自 00C297C7 ;第五次
0012B864 0012B99C \pModule =
"user32.dll"
0012B860 00C297CD /
CALL 到 GetModuleHandleA 来自 00C297C7 ;第六次
0012B864 0012B99C \pModule =
"MSVBVM60.DLL"
0012B14C 66001BC5 /
CALL 到 GetModuleHandleA 来自 66001BBF ;第七次
0012B150 6600F4D0 \pModule =
"kernel32.dll"
0012B140 6600281E /
CALL 到 GetModuleHandleA 来自 66002818 ;第八次
0012B144 6600F4FC \pModule =
"KERNEL32"
0012B138 660031CE /
CALL 到 GetModuleHandleA 来自 660031C8 ;第九次
0012B13C 00000000 \pModule = NULL
0012B860 00C297CD /
CALL 到 GetModuleHandleA 来自 00C297C7 ; 第十次(加载运行函数过程)
0012B864 0012B99C \pModule =
"advapi32.dll"
0012BAEC 00C4444A /
CALL 到 GetModuleHandleA 来自 00C44444 ; 第十一次(注意观察寄存器变化,别犹豫了,返回的好时机,GO!)
0012BAF0 00000000 \pModule = NULL
/////////////////
寄存器 /////////////////
EAX 73D30000
offset MFC42.#1340
ECX 73D30000
offset MFC42.#1340
EDX 00000000
EBX 1C490012
ESP 0012BAEC
EBP 0012ED3C
ESI ED3C0000
EDI 0012D1E0
EIP 77E5AD86 kernel32.GetModuleHandleA
//////////////////////////////////////////
(
注意:在第四次F9运行时,程序EIP异常,不管,强行Shift + F9跳过运行!)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
00C44442 6A 00
push 0
00C44444 FF15 C8B0C400
call dword ptr ds:[C4B0C8]
; kernel32.GetModuleHandleA
00C4444A 3985 B8E4FFFF
cmp dword ptr ss:[
ebp-1B48],
eax ; MakeDict.00400000 //返回到这里
00C44450 75 0F
jnz short 00C44461
00C44452 C785 B4E4FFFF 9>
mov dword ptr ss:[
ebp-1B4C],0C4F998
00C4445C E9 C4000000
jmp 00C44525
00C44461 83A5 90E2FFFF 0>
and dword ptr ss:[
ebp-1D70],0
00C44468 C785 8CE2FFFF C>
mov dword ptr ss:[
ebp-1D74],0C4FFC0
00C44472 EB 1C
jmp short 00C44490
00C44474 8B85 8CE2FFFF
mov eax,
dword ptr ss:[
ebp-1D74]
00C4447A 83C0 0C
add eax,0C
00C4447D 8985 8CE2FFFF
mov dword ptr ss:[
ebp-1D74],
eax
00C44483 8B85 90E2FFFF
mov eax,
dword ptr ss:[
ebp-1D70]
00C44489 40
inc eax
00C4448A 8985 90E2FFFF
mov dword ptr ss:[
ebp-1D70],
eax
00C44490 8B85 8CE2FFFF
mov eax,
dword ptr ss:[
ebp-1D74]
00C44496 8338 00
cmp dword ptr ds:[
eax],0
00C44499 0F84 86000000
je 00C44525
; 这里就是大虾们常说的Magic Jump,把它改为JMP
00C4449F 8B85 8CE2FFFF
mov eax,
dword ptr ss:[
ebp-1D74]
00C444A5 8B40 08
mov eax,
dword ptr ds:[
eax+8]
00C444A8 83E0 01
and eax,1
00C444AB 85C0
test eax,
eax
(
注意:程序Alt+F9返回后,取消所有的断点!)
===============================================================================================
找到Magic Jump ,只要将je改为jmp,就能得到正确的输入表:
00C44499 0F84 86000000
je 00C44525
; 原来的代码
改为:
00C44499 E9 87000000
jmp 00C44525
; 修改后的Magic Jump
00C4449E 90
nop
(
注意:在脱Armadillo 3.0以上的壳时如果直接改为JMP,程序会异常出错!Armadillo旧版可以直接改的。)
===============================================================================================
用 Ctrl+F 在当前位置查找命令:salc 在00C44B61处,当看到jmp、salc、salc代码连在一起时,呵呵,恭喜,找到地方了,在salc上面的jmp处下断!
00C44B39 8B85 60E1FFFF
mov eax,
dword ptr ss:[
ebp-1EA0]
00C44B3F 8B8D F0E6FFFF
mov ecx,
dword ptr ss:[
ebp-1910]
00C44B45 8B95 64E1FFFF
mov edx,
dword ptr ss:[
ebp-1E9C]
00C44B4B 891481
mov dword ptr ds:[
ecx+
eax*4],
edx
00C44B4E ^ E9 47FFFFFF
jmp 00C44A9A
00C44B53 FFB5 50E8FFFF
push dword ptr ss:[
ebp-17B0]
00C44B59 E8 86C7FDFF
call 00C212E4
00C44B5E 59
pop ecx
00C44B5F EB 03
jmp short 00C44B64
; 此处下断
00C44B61 D6
salc
00C44B62 D6
salc
F9运行,断在 00C44B5F 处。当然,由于是动态解码,每次调试看到的地址可能是不同的,但代码是相同的!其实断在 00C44B5F 处时,IAT解密已经完成了。现在我们返回Magic Jump 处,改回原先修改的代码,在 00C44499 处点右键->“撤销选择”即可。
取消以前的所有断点。现在就可以在401000段下内存断点了,爽! 三、寻找真正的OEP
脱Armadillo的壳文章,已经有很多人高手写过了,所以这文章的重点在于大家以后能对Armadillo壳有更深的了解。
『用内存断点大法直抵OEP』
用 Alt+M 查看内存映射,在401000开始的段上,下内存访问断点,F9运行。
////////////////////////////////
内存映射,项目 23
地址=00401000
大小=00002000 (8192.)
物主=MakeDict 00400000
区段=.text
类型=Imag 01001002
访问=R
初始访问=RWE
///////////////////////////////
F9运行后,直接中断在OEP处:
00402600 55
push ebp ; 在这儿用LordPE纠正ImageSize后完全DUMP这个进程
00402601 8BEC
mov ebp,
esp
00402603 6A FF
push -1
00402605 68 F8354000
push MakeDict.004035F8
0040260A 68 00284000
push MakeDict.00402800
; jmp to msvcrt._except_handler3
0040260F 64:A1 00000000
mov eax,
dword ptr fs:[0]
00402615 50
push eax
00402616 64:8925 0000000>
mov dword ptr fs:[0],
esp
0040261D 83C4 98
add esp,-68
00402620 53
push ebx
00402621 56
push esi
00402622 57
push edi
00402623 8965 E8
mov dword ptr ss:[
ebp-18],
esp
00402626 C745 FC 0000000>
mov dword ptr ss:[
ebp-4],0
0040262D 6A 02
push 2
0040262F FF15 E0314000
call dword ptr ds:[4031E0]
; msvcrt.__set_app_type
00402635 83C4 04
add esp,4
00402638 C705 20424000 F>
mov dword ptr ds:[404220],-1
00402642 C705 24424000 F>
mov dword ptr ds:[404224],-1
0040264C FF15 DC314000
call dword ptr ds:[4031DC]
; msvcrt.__p__fmode三、脱壳修复
运行ImportREC 1.6,选择这个程序的进程,把OEP改为00002600,点IT AutoSearch,CUT掉无效函数。FixDump,正常运行!〓本文完〓
版权所有(C)2005 KuNgBiM[DFCG] Copyright (C) 2005 KuNgBiM[DFCG]--------------------------------------------------------------------------
Cracked By KuNgBiM[DFCG]
2005-07-14
18:36:36 PM
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课