|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。
4 h# o. }: C+ ^: ~( v- o/ m# u【使用工具】 Ollydbg,Loadpe,Imprec1.6F 8 p: \' |8 |) @( e2 K
【脱壳平台】 Win2K $ W& u7 x, c4 C8 ?+ j/ R
【软件名称】 按键精灵3 V3.11
- ?6 k3 @; [/ L* l5 i. d" X【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks
( v* Z- P L/ | J9 L) j2 \【保护方式】 Armadillo CopyMem-ll +Debug-Blocker
2 m9 D9 \$ E7 N, U【脱壳人】飞舞的T恤4 S7 e0 O8 E# W |, b
--------------------------------------------------------------------------------
; t8 I) S$ I1 ^, h& Z) J( V【脱壳内容】
, ~' x6 H2 s; S. r; Y1 }小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。
- G! q# k, H8 M$ w( z小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 % M& z% a5 p3 }5 G/ j+ c( B K0 i
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
4 U1 v4 ?2 {5 b; E7 P6 y/ ^- `OD载入程序,插件自动隐藏OD,忽略所有异常。
e& R- D( Y+ @' `. K00485000 按> $Content$nbsp; 60 pushad //外壳入口
+ j+ Q+ B# Y9 b00485001 . E8 00000000 call 按键精灵.00485006' \8 a! y- l2 Z6 z+ L9 b( Q6 w
00485006 $Content$nbsp; 5D pop ebp
3 K5 J; C( w5 w00485007 . 50 push eax
1 W: ^/ [3 y2 F00485008 . 51 push ecx9 m7 @: U# |. r4 p) Z0 o! T
00485009 . EB 0F jmp short 按键精灵.0048501A
' X: C9 A9 g; ^( C! l8 {..................................................................... 7 h4 e% F$ x& r( T
命令行下断点 BP OpenMutexA,F9运行。 ) k7 q$ v( j6 i# X d5 @
中断
( l8 V" j- d2 Y8 n; T* K2 I77E6C503 K> 55 push ebp5 R: ^1 |! l" ?" ]' P
77E6C504 8BEC mov ebp,esp
# V7 |; q: }1 Q8 Z" f" D* H77E6C506 51 push ecx
( M$ h+ Z0 A) F# `) p77E6C507 51 push ecx
- @7 A6 Q- x. P77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],03 b P: s. r, G8 w+ h/ I3 Y4 J6 U
77E6C50C 56 push esi
/ o0 H& I; T3 N& c77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
2 s6 G3 K5 }) h# i+ g! [3 H/ H% d.....................................................................
( N# ^, r. U8 v/ U- H% T R4 V! P堆栈内容
. S% g; r2 o: N. g" F/ c0012F574 0045C5F1 /CALL 到 OpenMutexA
' {) O. j, J6 z5 K0012F578 001F0001 |Access = 1F0001
0 I" P) a6 K X0012F57C 00000000 |Inheritable = FALSE; [- z( {7 u, s3 d0 n3 h+ h
0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。 * s2 @, M4 w$ _4 {, c( P
找一块程序领空空地址,写入一些欺骗Arm的代码。
! Z% a/ b1 Z+ v" H% kCtrl+G 401000
) l. |8 e, ~' }& I/ d$ R& C00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。
$ @' K+ L* z0 b# z% ?2 r$ S00401002 0000 ADD BYTE PTR DS:[EAX],AL
3 c. R C p6 u2 b3 i% g00401004 0000 ADD BYTE PTR DS:[EAX],AL5 Y1 N9 U. o( u! S7 R( n6 a
00401006 0000 ADD BYTE PTR DS:[EAX],AL+ b- U! O1 o/ h. H) V/ t
00401008 0000 ADD BYTE PTR DS:[EAX],AL
$ {7 o6 {4 [9 ]- `0040100A 0000 ADD BYTE PTR DS:[EAX],AL
, n3 `; d' c/ S+ W1 g7 V t0040100C 0000 ADD BYTE PTR DS:[EAX],AL
- V, |. Q2 J" d7 x5 f0040100E 0000 ADD BYTE PTR DS:[EAX],AL
' W8 o. `# Q& p2 yOD直接双击修改,填入以下代码。
: H* C- ]; C! n- A; V00401000 60 pushad/ {! Q5 Q! O1 E
00401001 9C pushfd8 s! c4 V! P3 r
00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"/ \, T5 G; M3 V& [+ C
00401007 33C0 xor eax,eax5 G6 n3 @- i' \0 `! B2 T
00401009 50 push eax* j: W5 h1 n8 k, A y2 m0 c) L+ P1 d
0040100A 50 push eax
" ~+ B& Z) d' q6 v0040100B E8 6D97A677 call KERNEL32.CreateMutexA. {1 E: \. e" u/ r
00401010 9D popfd
8 I1 _ i$ R& Y$ H% y00401011 61 popad
}; c2 f6 v3 ?5 n00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA
* F2 |3 F/ ~( c2 P4 P# {2 X............................................................
& k/ J0 ^2 {/ x2 h- v) `, p将当前的 Eip 77E6C503 切换到 401000 来。
* H1 r L5 u1 }, H7 q0 g, _( p点右键 选在此处新建 Eip ,看到Eip 变为 401000 1 x8 C5 W2 K3 D1 j7 R( ?0 H9 k: V+ S
F9运行。
K1 F& m( O0 b2 P' O4 n% h, k6 J中断
4 E" H! T7 Q/ [/ g1 T77E6C503 K> 55 push ebp //双击它或F2清除断点。: D2 d3 q m7 |
77E6C504 8BEC mov ebp,esp
$ |+ a! n1 X2 V% e77E6C506 51 push ecx
/ H# o K; A1 J, p77E6C507 51 push ecx
8 o) k1 r; F" g" o8 \77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
* y5 A* A, q9 W77E6C50C 56 push esi2 v" H% J6 w0 {3 N
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D: H1 L8 }5 f* f
............................................................ 6 \8 a4 O2 I( f9 F O' t* B6 c9 ?
找 magic jmp 命令行下断点,bp GetModuleHandleA
4 U2 s& A$ ^' W. f$ I77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。5 W- a8 Q7 I# P$ }; K1 R* J
77E63DFD 8BEC mov ebp,esp- q% w7 }. q8 w* Y2 j2 ]0 R1 U; k
77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0
3 O/ k7 }! r% O/ ^7 L) L77E63E03 74 18 je short KERNEL32.77E63E1D
& H6 |8 K& _$ q77E63E05 FF75 08 push dword ptr ss:[ebp+8]$ V& w( h2 s7 v+ b* X1 {
77E63E08 E8 87FFFFFF call KERNEL32.77E63D94
+ h0 Q( Q8 q4 d% ~/ h* l4 K77E63E0D 85C0 test eax,eax
, ^- D# Q$ N1 R4 S8 r/ n0 F77E63E0F 74 08 je short KERNEL32.77E63E190 p5 B V- q* f1 {( G: e5 g
77E63E11 FF70 04 push dword ptr ds:[eax+4]8 `* O* a* C7 a0 p" U" w, J
77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW# l" C! L- n; L& ^; [
77E63E19 5D pop ebp
, y; I5 o" {+ ?3 D# [' ]9 s77E63E1A C2 0400 retn 46 i% z. j# a) \' c
........................................................................ $ R7 q% W* j3 _2 V) x, O
F9运行,多次硬件中断,注意堆栈值。
0 F9 D& _5 l6 t1 _, Y; Q/ E$ F) m7次F9提示一个非法指令错误,Shift+F9忽略。* [& H% C# |% x: n/ p8 t! \* X
0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801
/ ^9 I, m3 V0 S0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
5 M/ P; z" c; S* G& ^0012BF00 00B2E67C ASCII "VirtualAlloc" % k5 w& x& ~! ? r R
0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E8 L; R; u' B2 m' U2 y& t1 y; j
0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
: p- X) g4 Y4 M* x6 \' Q3 C; s0012BF00 00B2E670 ASCII "VirtualFree"
) w2 m# x" l. h5 P0 N! b' f9次F9提示一个非法指令错误,Shift+F9忽略。
8 X" b. I+ |* {1 ?堆栈内容 " E6 |8 @' U: ?1 t$ s1 S3 i
0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995
4 `* Y, d/ z# G+ U, z' A1 w% Q0012BC74 0012BDAC \pModule = "kernel32.dll" * M5 q V. p5 K, T- d
点调试菜单,里面清除硬件断点。
$ k) A7 P) @0 e. W7 t( o2 g. x1 DCtrl+F9 返回。
3 Q2 F. U, `, i2 j0 q00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA2 ]3 q/ L4 a) L' S3 U% e, p4 L
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
; O$ l ^% c4 m* \$ U* a6 q00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
2 Z( C+ ~4 p6 n0 K* ~00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
3 j0 L! B( u7 E/ i4 f! f00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi, E% h8 d6 P/ k
00B079AC 75 16 jnz short 00B079C4. b' l9 A8 |$ s
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]5 i3 Y. d3 K2 R
00B079B4 50 push eax1 p2 `5 Z2 `+ m- M
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA) T# ` w5 `0 ^$ j
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]- [5 v6 Z1 F6 R. k5 Z7 C* B, _
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
0 B* f- a8 g7 ~7 b1 o: ~- n00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]4 x" x+ h0 e; J6 s+ Q; l& s
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
% J* S1 b4 o @9 P! G* P8 \00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 3 {2 J/ @. q( J; c" Q8 G3 z
改为 / C+ j! X2 }( i5 N* I
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA8 P/ V. {# l. x
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]) Q+ h/ x$ i/ \: y
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax# d9 g+ J- \9 q4 {' f2 O
00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]! H( L5 {$ ]! x2 Z' n7 e1 a
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
0 Q1 Q$ P/ C$ z7 U0 v00B079AC 75 16 jnz short 00B079C4
% F! U0 ~1 X! ]* ~( u' ? u00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]( a/ j1 ^' a5 I: C$ J; A
00B079B4 50 push eax* U" o0 s6 L' `" p# k: d; y, r$ F( M
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA1 }+ `: q0 [7 G: D
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]# o7 x5 k. Q; F3 ~7 f
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
]3 y2 G2 u' S! [3 G. h00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
" d' t1 F" ~& F00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi* o/ @2 @5 n/ e6 Y
00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z) " b% r3 P. [3 O) H0 d
......................................................... ( q0 S J, ?- P" e6 z" r' e1 r/ k
清除所有断点。在401000段下内存断点,按F9 * S I3 |! w! o# Z" T
00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里
, I+ R$ ^: A8 `! h7 j* ?' d00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]* H+ ~! j2 _" ~2 n3 d
00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260( r- A( t- u: ~+ a; L. ^8 `
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]
}5 @- W3 X( m9 h3 O00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952605 I P2 e* ]) A6 z# C
00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]
6 M& Q8 {8 t7 ]0 F$ i8 H/ F8 z00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260) E0 @8 Q6 t7 h% B5 q! m
00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]1 j4 X# C+ h; A" j q _. S
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952600 |" I1 n7 V7 T# @8 N, m8 s9 V
00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20] . Z3 {' A6 P* e. }$ @! K; M
提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。
3 l+ o# [6 v d6 ^* m天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”
! L9 J) t7 ]2 g) u6 j想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。
7 E' a* t: h v9 D# s* K! a, P" Q0 [期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^ 1 F1 P6 t8 ^1 B8 s+ v; X
后来还多亏wangli_com大大的指点。。。
4 }, _5 \2 z: W先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行 9 B8 X" g+ P0 Y! V; ^5 q
77E7A6CF K> 55 push ebp //来到这里,F2清除断点# z" m# U, F$ Z7 x# { w# O
77E7A6D0 8BEC mov ebp,esp/ v+ x' j- e* q/ G6 M# f( }
77E7A6D2 81EC 9C000000 sub esp,9C
9 i- D4 H# N5 P' ?77E7A6D8 53 push ebx+ j( V: m# H/ W7 @! [& Z
77E7A6D9 56 push esi
# S7 z5 F0 V2 E% j4 ]# q7 D77E7A6DA 57 push edi |