|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 0 J {* O/ _) [ F, Y* s
【使用工具】 Ollydbg,Loadpe,Imprec1.6F 3 ]% N2 z0 q E+ M$ f
【脱壳平台】 Win2K
& E# p3 }' M8 a, i4 ^% K【软件名称】 按键精灵3 V3.11 ( q, g6 a' Y7 |) E! M
【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks * O1 y: L8 B& l! u, U
【保护方式】 Armadillo CopyMem-ll +Debug-Blocker
: q8 h7 l1 T# t6 H) [【脱壳人】飞舞的T恤7 x: B& S4 R# D6 V- C/ C( ^) T; Q) W* a
--------------------------------------------------------------------------------
u% E L, y( |2 h# V【脱壳内容】 2 m! l" J. G8 {. r
小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。
9 d, j5 t8 u @. z/ w( E& Q小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 . \# {9 V0 j0 z5 j4 x+ g3 n
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
" A; M$ }0 I! H: ]8 Q% a& G4 cOD载入程序,插件自动隐藏OD,忽略所有异常。 ( @, E4 g8 H+ j/ D0 s4 h
00485000 按> $Content$nbsp; 60 pushad //外壳入口
; Z) I- l* H) x2 q! Z/ `1 S00485001 . E8 00000000 call 按键精灵.00485006
! o( B2 a* @+ \7 G. y00485006 $Content$nbsp; 5D pop ebp
/ @( K3 O- X# `+ T/ H: _2 j00485007 . 50 push eax$ l; _) R3 K! u! J. d
00485008 . 51 push ecx
" x2 M# D: m$ h4 A+ C00485009 . EB 0F jmp short 按键精灵.0048501A
9 q4 r( a* v3 T. m4 R4 {.....................................................................
7 x& I W8 ?. P# R' }) |命令行下断点 BP OpenMutexA,F9运行。 6 d! d2 w% M/ d- q7 E' ^
中断 % @ `- ~& H1 e: T) t! i
77E6C503 K> 55 push ebp
# Y3 ?# o4 c/ |1 }; g77E6C504 8BEC mov ebp,esp4 `- s/ ]5 m* [* u
77E6C506 51 push ecx
* D2 A) R" X, t3 m- R. B77E6C507 51 push ecx
2 X3 w* W& Y0 e- x% _1 c2 e% O' _77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],07 P: H, g7 i# K/ T
77E6C50C 56 push esi8 f& J' ?9 f8 Y8 w
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D5 ?9 B4 L6 b. M) x
.....................................................................
3 x% ^' r( V5 E1 u- s% L8 L堆栈内容 # \: A5 q3 O, D* d1 M$ m
0012F574 0045C5F1 /CALL 到 OpenMutexA( g, f2 I5 x( O6 k( G5 e
0012F578 001F0001 |Access = 1F0001! ^3 O* g5 B8 Y3 g
0012F57C 00000000 |Inheritable = FALSE- E. g9 L" t7 m
0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。
+ d* J& S$ P! n1 N/ J找一块程序领空空地址,写入一些欺骗Arm的代码。
5 q7 [# u! Y# WCtrl+G 401000
# x) W. b# H( B: ~00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。
2 m6 a; O' n2 \- q3 ]" X5 d) J7 I, M00401002 0000 ADD BYTE PTR DS:[EAX],AL
# y3 @! c6 F0 k1 }4 F00401004 0000 ADD BYTE PTR DS:[EAX],AL
0 D) F7 x! i. L00401006 0000 ADD BYTE PTR DS:[EAX],AL
, k2 y# s; ?) R& Y00401008 0000 ADD BYTE PTR DS:[EAX],AL
# H; J, O6 p6 S! M; F' G0040100A 0000 ADD BYTE PTR DS:[EAX],AL
1 R6 h1 u- N2 f( i0040100C 0000 ADD BYTE PTR DS:[EAX],AL
/ H4 X/ Z- P. D% u& X8 e% \9 \0040100E 0000 ADD BYTE PTR DS:[EAX],AL
6 Q& `* W* C8 f- n1 H3 S) q9 m5 m- hOD直接双击修改,填入以下代码。 , R# ]9 X0 M! R" J
00401000 60 pushad1 P* n; R& @- q- o8 C- g( N
00401001 9C pushfd' i- B0 Z. K5 P1 v5 d
00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"
" H& } ?% \$ O* u' Y! l8 q00401007 33C0 xor eax,eax* m. x2 W' Z! S( y7 S
00401009 50 push eax) i* j* h/ K- h+ W; Y
0040100A 50 push eax
0 I3 y5 I0 R+ W0040100B E8 6D97A677 call KERNEL32.CreateMutexA3 M! k% ~! @2 ?6 J1 D
00401010 9D popfd' U8 f1 X5 g! c0 W9 s
00401011 61 popad
# E; F5 y" {; c8 ~! ?' p, I* B00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA
1 } |- r. L A% n............................................................
3 X8 R, p. j! r. d, y7 J- s将当前的 Eip 77E6C503 切换到 401000 来。 8 C7 u, J! W. v4 d, f8 l/ `
点右键 选在此处新建 Eip ,看到Eip 变为 401000
0 J! [% x2 h1 w6 q# Y* u) [( XF9运行。 ! I+ {) U6 q) u3 o& \" l
中断
$ Z9 b, O. X' B77E6C503 K> 55 push ebp //双击它或F2清除断点。
1 |' n" L. U9 z1 G) y77E6C504 8BEC mov ebp,esp
- _. G: Y# N9 M5 ]7 c, r8 ~1 U, f5 E77E6C506 51 push ecx2 g) e+ L5 o3 {* ? f" g
77E6C507 51 push ecx
8 H. @( `7 q' P, G77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
& m2 K# d3 O3 ~+ X6 k7 H77E6C50C 56 push esi- {. `# @: _' E& T6 D% o) }
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
' S$ Y! r: M/ [( \9 L............................................................ ) r3 T& A& _2 a# e W
找 magic jmp 命令行下断点,bp GetModuleHandleA : Q' W9 l' n" T; \
77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。) ]. [3 ]/ t+ O9 S6 N0 E; n
77E63DFD 8BEC mov ebp,esp
* N5 d3 s& Y1 B8 E1 X. w6 H5 I77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0* @) A1 N. S# P, T/ V
77E63E03 74 18 je short KERNEL32.77E63E1D
8 N# [) y/ _4 G9 J- v77E63E05 FF75 08 push dword ptr ss:[ebp+8]
3 j7 k" ?) ~5 a2 x* x4 p o77E63E08 E8 87FFFFFF call KERNEL32.77E63D944 V7 V2 t7 q+ G
77E63E0D 85C0 test eax,eax
g2 n' P1 U9 z' F+ _2 f7 n, t77E63E0F 74 08 je short KERNEL32.77E63E19: ?# ], M5 [/ m Y+ L
77E63E11 FF70 04 push dword ptr ds:[eax+4]
; d( S( X+ O! @, T' B77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW$ s: _8 X+ p1 P# \/ \9 s% m
77E63E19 5D pop ebp
2 C4 {. |, q% d% D9 `77E63E1A C2 0400 retn 4
|9 D+ c% L6 Y! P) B% [/ Z........................................................................ / A0 ]8 T* P2 A. p0 w
F9运行,多次硬件中断,注意堆栈值。
. v* q7 o o' n* |9 Y) L! {7 `7次F9提示一个非法指令错误,Shift+F9忽略。$ c# L8 ]- I+ B
0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801
P' p7 [# g( j0 B* p0012BEFC 00B2D6C8 \pModule = "kernel32.dll": L) |2 ]# Z" p& Y/ d
0012BF00 00B2E67C ASCII "VirtualAlloc"
8 [) C2 S" Y+ R, J: Q/ m m0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
+ |4 E: X. q) h; e t% Z0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
" P8 |# W, Z; h( [/ f0012BF00 00B2E670 ASCII "VirtualFree"
5 Q9 Z; C n& O8 E( `9次F9提示一个非法指令错误,Shift+F9忽略。 8 G9 z$ C7 u7 i9 A5 j
堆栈内容 ' h4 ~% t' I/ {0 y6 o& m4 m
0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995! p" M/ `. W4 J% u n) f/ x# }
0012BC74 0012BDAC \pModule = "kernel32.dll" / v9 T. V% J$ m f. r' |7 }
点调试菜单,里面清除硬件断点。
9 ~2 L& e: t) sCtrl+F9 返回。 / ~- ^9 I+ ?- U% j6 }; O
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA$ s) D1 C ?4 q. t. S( v
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
. Q+ w: {' ?( }- k% ^1 L' Q$ o00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
. @3 O- Z0 m* V& t5 e00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]! S+ q, _& i' {' b O o# x
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi6 S1 v$ E3 S/ v1 G) e
00B079AC 75 16 jnz short 00B079C4
6 w! J, M m! H3 J0 H+ X: j00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
% Y% p, J, k: z5 T1 b1 ^; z1 a2 K00B079B4 50 push eax
" M. G4 }( y) n. ?+ d00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA
8 C9 ^6 D! i E/ u00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
+ _+ W4 {0 W! v3 O2 V1 m00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
, ]% F+ y: `. n- E$ T7 V00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
( S5 G7 Z7 w# r! j00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi, |" E: z, l! O7 i
00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 + C% o; D0 j8 C
改为
+ i' z, F. }) P, ^" |6 a) p00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA! ^8 S; ?# y! v& _+ d
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]1 i g2 S8 p+ q1 c5 m; q9 ?
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
3 T V/ @* i: K$ l, G: Y00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]5 m. ^* n! n3 l* c
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi2 R, v- k L. S6 B; B2 V5 p; k
00B079AC 75 16 jnz short 00B079C4* z- x3 z( F5 n7 M# {5 ^, w, T1 |3 k
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]' \6 E/ ?1 ~7 n G" ?( K9 x
00B079B4 50 push eax
h/ ?' E3 z% B4 f9 q1 d" o00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA. }( s; n- M9 \) V( p6 J) B
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
7 s' m6 e( n5 N, S! R E00B079C1 89040E mov dword ptr ds:[esi+ecx],eax8 [) h& g8 g w* e6 v6 E
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
" n1 u) Y- g& j, }7 h5 S% I5 ~4 r/ X; A00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi+ H! O/ L. }" O4 G, ]
00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z) % h k; W1 M+ y8 _
.........................................................
, ?! ?* ^% S; V J清除所有断点。在401000段下内存断点,按F9 7 P8 e, Z& G3 ?+ p+ l, {' v
00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里
# R2 O6 D; ~: G X! H00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]
* e2 m4 w. c( G5 V& D" Q. ^7 k4 M# y00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952604 |# ?7 g9 a( N4 d' u
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]' W1 G( O2 q E( L! c( @4 q
00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
6 ^9 B b& M$ E9 o+ S3 ~3 p00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]
( X' A( w2 R7 b4 b00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
5 R4 ], `! W. ^5 l00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]) Z, Y5 g% V) C
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260* J3 t* t: M$ k2 h, B5 Y4 G
00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]
# w6 q; U1 f4 L6 B' T7 b2 f提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。 & [- J/ k9 H3 z& p
天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”
" ~$ D- Q- ^0 g' V2 d$ N; J- F想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。
$ E1 V6 h2 x/ a! x: s( n) E期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^ % [+ v- @# a2 G5 R; c) X
后来还多亏wangli_com大大的指点。。。 1 q) i$ r, o$ J
先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行 $ \- R5 `. ?" f5 R
77E7A6CF K> 55 push ebp //来到这里,F2清除断点
) i% X4 e7 u, W3 z' v9 _0 N' `1 {* [77E7A6D0 8BEC mov ebp,esp
! O% Q2 |; A$ F( ?* r. B: l77E7A6D2 81EC 9C000000 sub esp,9C7 {/ t; Q" A; m3 t# j
77E7A6D8 53 push ebx
1 c) j5 r v. [ {77E7A6D9 56 push esi
8 b, f7 C3 N' z6 B77E7A6DA 57 push edi |