|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 2 N. Q6 j( u& N `. h
【使用工具】 Ollydbg,Loadpe,Imprec1.6F + p" n f a2 |/ m! [0 h3 }
【脱壳平台】 Win2K
+ e; S# f4 a7 P8 ?# L【软件名称】 按键精灵3 V3.11
; O& P+ Z5 E4 f" z0 S+ P【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks
. s& R. j: X/ D【保护方式】 Armadillo CopyMem-ll +Debug-Blocker
( B3 L' w. Q( I1 M【脱壳人】飞舞的T恤
5 p1 c7 L n( v4 m0 c* Q6 m) I-------------------------------------------------------------------------------- $ }" F0 y0 b0 ?$ S% j
【脱壳内容】 " l4 T+ B4 H, G: I8 ?1 l
小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。 8 }/ f" ?) x4 I# z" T
小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 ' I# R* a6 t/ x, [
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
& d) G" u( K6 g$ s8 w' ?OD载入程序,插件自动隐藏OD,忽略所有异常。
' @3 E( O- S$ F: M1 Y" x( j00485000 按> $Content$nbsp; 60 pushad //外壳入口
; F: K* V/ ]3 g6 U& i8 ?: y00485001 . E8 00000000 call 按键精灵.00485006
. ~1 [% o" c0 ]00485006 $Content$nbsp; 5D pop ebp
6 L' t, I( T4 k3 c S Q00485007 . 50 push eax
. U5 |) r7 }% A/ U00485008 . 51 push ecx
0 a4 u+ b8 K0 @7 u7 @9 l4 @00485009 . EB 0F jmp short 按键精灵.0048501A& r+ @" X+ q; e; N$ D3 }: w/ i
..................................................................... 3 p: B1 D7 l2 w, B. r+ W
命令行下断点 BP OpenMutexA,F9运行。
7 L J7 J p6 t- c9 b中断
- A9 E& F& i' U1 h77E6C503 K> 55 push ebp- S. J* u" [% `+ q- j$ F. B
77E6C504 8BEC mov ebp,esp6 b5 q8 X, _' k
77E6C506 51 push ecx
6 i/ r: c0 z6 M% T3 c77E6C507 51 push ecx
" ~9 _; p a" L9 K77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0. C6 n4 J, j w) J: D: @
77E6C50C 56 push esi5 h2 K& U) i4 ^& H2 j, U" [
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D+ |1 i- F/ X+ t9 N. f
..................................................................... 7 G4 V2 }% C3 u/ D0 J. N1 H5 w$ j
堆栈内容 3 ]# D$ T* F* n \
0012F574 0045C5F1 /CALL 到 OpenMutexA4 d6 [/ |, C) x' s
0012F578 001F0001 |Access = 1F0001+ F( L0 q% m7 d- h4 D
0012F57C 00000000 |Inheritable = FALSE6 `, |1 E) j3 B4 L) S; `% z
0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。
# @. w/ |3 Y4 l/ y5 m4 g- W9 L找一块程序领空空地址,写入一些欺骗Arm的代码。 # I- Q* n( d4 {
Ctrl+G 401000
( H' E6 b2 q0 L, m. b00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。
# E$ _# X3 k! K, _; |00401002 0000 ADD BYTE PTR DS:[EAX],AL
& y' p7 o- Q7 f00401004 0000 ADD BYTE PTR DS:[EAX],AL
/ ]' Y" @0 C7 n# |& Z+ _00401006 0000 ADD BYTE PTR DS:[EAX],AL' n2 [" k1 D. [! W# n
00401008 0000 ADD BYTE PTR DS:[EAX],AL' M6 F3 B8 W' J" |. x
0040100A 0000 ADD BYTE PTR DS:[EAX],AL
8 n9 R" f: J5 ]6 ?7 c( w7 \0 Z: q0040100C 0000 ADD BYTE PTR DS:[EAX],AL
6 I" Y# V$ W5 [1 R( _$ F; o0040100E 0000 ADD BYTE PTR DS:[EAX],AL
, Q/ |% G& m3 e0 l/ I3 p; U3 P K9 \, EOD直接双击修改,填入以下代码。
9 C( p8 g) }% c( O3 Z/ @% ^( f% F00401000 60 pushad% e+ ?0 O3 H% F
00401001 9C pushfd0 C" g8 ]. _8 |0 L( z
00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"8 M* x! f2 ^8 C& x- F* t9 q. f
00401007 33C0 xor eax,eax
* d9 r1 `# V+ r4 V8 G00401009 50 push eax+ J& \" R( P! F9 k, X
0040100A 50 push eax1 y% Z5 x; y0 ]8 X
0040100B E8 6D97A677 call KERNEL32.CreateMutexA/ ]8 w) F' Q0 R+ W: q" K
00401010 9D popfd
+ |4 R! F( A' G: I9 X3 n9 n+ c00401011 61 popad
0 m* M' V9 _0 ?7 g6 J5 F& o, B00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA4 b! k# R# |3 q
............................................................
$ V& ^% `8 L/ w4 ^$ P将当前的 Eip 77E6C503 切换到 401000 来。 q2 G4 a9 h+ i- h% m: B& y
点右键 选在此处新建 Eip ,看到Eip 变为 401000
! R2 Y U* m @F9运行。 " [) n2 W" K) |, Y- t
中断
6 Q& O% G2 ]+ Y! i' U* o77E6C503 K> 55 push ebp //双击它或F2清除断点。
4 _: j p8 v+ V+ z# w: K+ Z }4 j77E6C504 8BEC mov ebp,esp9 J& I2 N5 ?- j) w) n/ n% U7 G
77E6C506 51 push ecx
$ A9 e# r' T {9 x/ n77E6C507 51 push ecx# v6 H# [, X0 G( |2 i1 R0 h
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
+ h; ^# ]. S% G: L2 b+ E77E6C50C 56 push esi
2 p0 }2 {: V" f0 b! U; R77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D0 \" ^. x% ?2 I$ d$ N& `2 `4 w
............................................................ $ K" ~- @( p6 u& A" m( f& S: U
找 magic jmp 命令行下断点,bp GetModuleHandleA
6 }2 R K. U- |& i) J5 C7 L77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。3 A6 R% _. L' y* m( k
77E63DFD 8BEC mov ebp,esp
7 H7 [7 w7 L" S# Z& d( C+ w' M77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0
7 L" e8 l# Z0 V0 a' O! h; U# P77E63E03 74 18 je short KERNEL32.77E63E1D+ I) n6 I% _) V, C. R. p+ A
77E63E05 FF75 08 push dword ptr ss:[ebp+8]
$ D4 U' \4 _ B. J+ g77E63E08 E8 87FFFFFF call KERNEL32.77E63D94" w2 L5 U3 D/ L( x* l$ C0 ]
77E63E0D 85C0 test eax,eax' O4 l8 [! r: {. P* z
77E63E0F 74 08 je short KERNEL32.77E63E19
# F0 i2 w |; D; a77E63E11 FF70 04 push dword ptr ds:[eax+4]# }% q; d n: W/ N/ I- |
77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW
0 l$ X$ y) ]# {# r# Z77E63E19 5D pop ebp
E$ |' z' g* Z1 S' l( k77E63E1A C2 0400 retn 4& x8 m- B) t! B# I% P! f" Y P- x
........................................................................ 8 p: G4 a+ C3 e6 q" H! y" U& c
F9运行,多次硬件中断,注意堆栈值。 0 |1 `9 N; Q+ H
7次F9提示一个非法指令错误,Shift+F9忽略。: F' ?: O. X+ M; @
0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801) o# w' O0 O0 o6 P0 F
0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
8 Q: B% a" J2 |% \8 D' I0012BF00 00B2E67C ASCII "VirtualAlloc"
! z1 P6 @5 }! o) Q8 \9 G0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
. [& g$ z* V* a- d0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
" @6 O& f9 R" X( _0 S, w0012BF00 00B2E670 ASCII "VirtualFree" ; p0 ~; e0 R1 Y8 }& s8 l
9次F9提示一个非法指令错误,Shift+F9忽略。
: q6 l; ?. k9 {6 u/ B! k! z+ U堆栈内容
2 D0 C8 }; ]. ^4 A& E# w$ x0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995. a$ ~! s) t* `' a
0012BC74 0012BDAC \pModule = "kernel32.dll" : d* c1 i8 N, b* g4 _
点调试菜单,里面清除硬件断点。
u* D: d0 `7 V p0 N( N: }8 [Ctrl+F9 返回。
: ] X: U4 {) Z3 V1 {00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
8 \9 v3 ]( m. G# T) A00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
2 k9 E U' R9 C& k- q00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
: _1 _( u' A' [1 P* M% Y00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
+ s4 v" e' d( r/ _00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
z* }0 ]/ m* m0 P. Q00B079AC 75 16 jnz short 00B079C4
, u3 @# f# c1 M3 t* b00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]' y8 K1 H- I" K' E1 [" r5 o
00B079B4 50 push eax; \6 M$ W7 x' v/ \
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA4 f* t4 p) I1 S, u
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
+ n; @: ]- k! u& b/ e2 o00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
8 A, q+ V1 e- H$ J0 E' J) |" _00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
8 T: Y: r8 a7 I0 o$ [00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
! W; F' S' r& j' @, K' D9 [- L00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 $ F1 E Y# g! [6 [6 D
改为 ' V6 u r H7 \, h) I
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA5 K+ |3 t; }; h! M; m p
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]+ @" o) W% u8 p: `! P6 \# V
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
, b3 Y; ?( X6 ^ |; [3 B$ R00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]$ ~: _1 v3 U6 u; _7 N$ w1 O
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
$ G* h1 s. C x7 R00B079AC 75 16 jnz short 00B079C4
% R6 E6 H v7 O4 j9 d7 \$ ^00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]7 l7 }) f1 F/ n( W/ [
00B079B4 50 push eax. ~2 V& m0 f2 l( [
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA5 s$ ` V2 f( }! D/ \
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]* E8 l: ]0 S4 p3 I8 E
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax& }& |5 M0 s. C& N
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
" L' d& s, ?) N1 B: t! n00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi# f8 z1 C7 E4 X) U
00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)
6 x$ k0 I5 p" P5 `' b......................................................... 5 }$ _ K: f5 C4 [. a5 }
清除所有断点。在401000段下内存断点,按F9
. t: u& ^) o3 C% m$ K- E; d& x00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里# y( I* C. g4 v& w: i
00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]$ H# m. Y3 R) @$ I2 Q4 q# P Q
00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260. I6 I7 w0 `& M2 C1 f {
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]
+ A$ e2 Q3 s* G$ u/ w00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260; \) w$ g( |5 @# g o
00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]2 }: _+ S# K& \# X) O# t' r! D6 s
00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260! B/ l9 I% a& e
00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]7 e7 S+ f, A2 T! |- R9 o+ x; G6 f) l
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260# ?+ b" a/ o# O* ~9 p H
00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20] ' z2 M6 c7 g# v- E6 X) w
提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。 - l5 @. F7 i8 j* f; ~9 N# q
天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置” 2 ^, y/ M0 c; Q% d
想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。 3 S1 h% `; |5 `8 C
期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^
0 W# K6 f" y1 @后来还多亏wangli_com大大的指点。。。
, ~6 I$ q; g% E2 L9 \$ t! y" l) e# {先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行
4 D2 d; H+ S9 G! j. r3 V! }9 ~' H& ]77E7A6CF K> 55 push ebp //来到这里,F2清除断点" @6 [9 H6 D+ O1 _" ^7 f
77E7A6D0 8BEC mov ebp,esp
+ z2 Y% D; c+ J1 ^$ g. @" e I77E7A6D2 81EC 9C000000 sub esp,9C
# {( @9 \3 t8 k" ^77E7A6D8 53 push ebx0 V2 G, d" n3 d$ C5 x& s5 q1 g2 ]
77E7A6D9 56 push esi
6 s+ f2 o8 A( e& t0 X77E7A6DA 57 push edi |