|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。
1 }) @3 {2 ~, ~: r【使用工具】 Ollydbg,Loadpe,Imprec1.6F
2 S" S* f, j) z) t! `5 m【脱壳平台】 Win2K
; b: v9 d% e4 G6 b" c" y5 i7 l2 Q. O【软件名称】 按键精灵3 V3.11 + `$ ]/ Q/ ` _2 c3 w: O
【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks 6 d0 }& ?4 k9 N! ^+ Q, P
【保护方式】 Armadillo CopyMem-ll +Debug-Blocker $ S7 \( [' Q: Y' z
【脱壳人】飞舞的T恤
9 T! F9 p% c9 ?% _& V-------------------------------------------------------------------------------- ) d, E7 E2 Z! z& g8 C2 H& T2 ^8 y7 Z
【脱壳内容】 7 a- j0 |* q4 Y% x ^' [
小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。 , W5 ~8 M6 ?$ K" i; t( h
小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 ! R, K# o6 E0 i
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。 3 J, v! H8 N- Y$ S0 k$ ~8 q
OD载入程序,插件自动隐藏OD,忽略所有异常。
n, j3 h7 w9 t* k: h! V00485000 按> $Content$nbsp; 60 pushad //外壳入口1 Z, q5 C6 F$ P7 Z+ s
00485001 . E8 00000000 call 按键精灵.00485006
0 ~5 b! {5 q, S" F( u00485006 $Content$nbsp; 5D pop ebp6 d/ _* [! |& u& z. {0 _
00485007 . 50 push eax6 P" u( O2 |* X
00485008 . 51 push ecx3 [% x4 \5 q+ F# M2 T: E# s
00485009 . EB 0F jmp short 按键精灵.0048501A
9 W, d! ~; T- C9 k' D.....................................................................
% W+ j: j. @! J; y6 f6 @9 t命令行下断点 BP OpenMutexA,F9运行。
/ t3 ?/ f g, `. B* _中断
* i( @: \) G* O8 Z7 y77E6C503 K> 55 push ebp+ U1 y8 I, @0 w0 [
77E6C504 8BEC mov ebp,esp
0 B! G2 A, n$ E" q O. f( g77E6C506 51 push ecx J6 { S4 _/ y# x% J! }" u
77E6C507 51 push ecx3 Z1 Q* q: g' M* j
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0/ x4 y1 O! R# {6 }
77E6C50C 56 push esi/ @! p. m4 I+ [, d6 |
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D7 i0 i% [- d5 c5 E m( G5 _
..................................................................... : O J$ f$ a1 i& \( _: o
堆栈内容
1 x K& n4 X0 b I) d0012F574 0045C5F1 /CALL 到 OpenMutexA
4 O, q9 Y5 i9 l6 Y) n4 v0012F578 001F0001 |Access = 1F0001; [ |3 c6 j: N7 e) T* M, d( j
0012F57C 00000000 |Inheritable = FALSE; ]7 ^% N3 ^+ H& |# a
0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。
/ R# J' U; S$ [: H0 D/ q找一块程序领空空地址,写入一些欺骗Arm的代码。
. v$ x% t. b. ~: NCtrl+G 401000
: ^) v [9 ^& Q, J3 P7 k00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。
. l- a, ?3 u5 ]9 \' |00401002 0000 ADD BYTE PTR DS:[EAX],AL
# p- j1 A1 {( i' ~( P- m00401004 0000 ADD BYTE PTR DS:[EAX],AL4 U- E$ o8 l; y! [/ v2 Q5 P
00401006 0000 ADD BYTE PTR DS:[EAX],AL
/ v4 K; z) g8 A, W& Q00401008 0000 ADD BYTE PTR DS:[EAX],AL3 r, D. |0 k2 F9 ]+ O+ w
0040100A 0000 ADD BYTE PTR DS:[EAX],AL: q' d; i, d( x1 q3 S' {
0040100C 0000 ADD BYTE PTR DS:[EAX],AL
0 }2 U" ~, w2 L$ X0040100E 0000 ADD BYTE PTR DS:[EAX],AL
0 r$ H, {' {( L% w3 a. O. f/ DOD直接双击修改,填入以下代码。
, ^3 D4 m5 p3 G' k2 l00401000 60 pushad
* v \2 L( r+ R C0 W. A00401001 9C pushfd
& f; p+ A$ c8 \00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"
. ]/ d0 K9 D2 l& @00401007 33C0 xor eax,eax6 K6 k, h. n9 B& J
00401009 50 push eax2 ]$ P E/ Y0 j2 Y- C2 c% ]8 _
0040100A 50 push eax
/ v: C' ~5 s# u, v; n8 w0040100B E8 6D97A677 call KERNEL32.CreateMutexA7 b; N, J' {: b8 L% l, y9 b3 L
00401010 9D popfd
! u4 z) s1 ~) e* a00401011 61 popad
3 z5 {9 v/ u3 L# T00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA2 Z- D# L/ F$ |2 D) O& B
............................................................
+ y: k& S, d9 J- C( E1 b将当前的 Eip 77E6C503 切换到 401000 来。 6 \7 O) n: U) n/ e. x7 n+ J
点右键 选在此处新建 Eip ,看到Eip 变为 401000
. P' V- I; L0 C1 I; U( A2 gF9运行。
1 r0 I% m& e. l% s中断
+ ^) F$ T* _1 Q% U77E6C503 K> 55 push ebp //双击它或F2清除断点。
9 M7 {3 b) l5 ]- P# F: @- L77E6C504 8BEC mov ebp,esp8 a& Z3 p1 x7 P% O5 l) @
77E6C506 51 push ecx& t* S5 H7 }/ D; \. s, }5 ?
77E6C507 51 push ecx/ z/ ]3 p) l' G% p+ L% v- A8 ~
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0) q) Z' M; z" n/ I% B# G* o1 e
77E6C50C 56 push esi9 Q8 X( t, A5 z( b2 H3 {; p! _
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D [* r9 e9 W9 v1 h
............................................................
7 l# ?0 y/ p% R) X4 I找 magic jmp 命令行下断点,bp GetModuleHandleA : T% k. n$ [( @$ y
77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。+ o6 G Y; P. I% N
77E63DFD 8BEC mov ebp,esp+ z# d' l5 x- }6 W+ S
77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0$ U) ~" e* a) R' M, G) l
77E63E03 74 18 je short KERNEL32.77E63E1D. o3 r7 c' c% k* F6 {: ]) W
77E63E05 FF75 08 push dword ptr ss:[ebp+8]
4 G/ `. ~) G z, p: u77E63E08 E8 87FFFFFF call KERNEL32.77E63D94! B* v3 U( Y# X. A! C
77E63E0D 85C0 test eax,eax
7 S1 b& t/ w3 e% c7 a8 _( |77E63E0F 74 08 je short KERNEL32.77E63E19/ b7 ]# K9 n( l& a8 |# v
77E63E11 FF70 04 push dword ptr ds:[eax+4]
, w2 q0 ]* M" N) q; x77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW, y5 O9 F# B$ `! o7 R, C6 X
77E63E19 5D pop ebp
( d0 a( `8 _3 }+ R77E63E1A C2 0400 retn 4! ]; i+ T+ y* R) g; o/ C% K
........................................................................ + w6 A) z, B/ A! `$ |
F9运行,多次硬件中断,注意堆栈值。
7 t6 |. w0 B. y" u8 E7次F9提示一个非法指令错误,Shift+F9忽略。
' Z9 ?7 K- H9 C' X& i" j: L0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801
! B6 J4 u* ?6 u" C7 ]0012BEFC 00B2D6C8 \pModule = "kernel32.dll"& o1 N* b- q4 \0 p
0012BF00 00B2E67C ASCII "VirtualAlloc"
. X+ l4 b- b9 q& y0 t0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E. h; e. C! [" b6 ?9 |& A: E
0012BEFC 00B2D6C8 \pModule = "kernel32.dll"; J& E( B4 f/ S8 J
0012BF00 00B2E670 ASCII "VirtualFree" % x0 l( R( t/ T! L& w- D: q
9次F9提示一个非法指令错误,Shift+F9忽略。
! V; z& N; P' W+ |# B1 k堆栈内容 - P6 h( I* A' l( n: Z
0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995, u* m& Y: s$ D
0012BC74 0012BDAC \pModule = "kernel32.dll"
8 n5 F# ^7 f6 S' |" M; v点调试菜单,里面清除硬件断点。
# v2 P/ C9 s- Y( S- vCtrl+F9 返回。 1 A- g7 H/ Z) S! J
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
# h, p) K( t( d' [* a; b* s00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
' Q1 k, S! E7 G5 n, G% L00B079A1 89040E mov dword ptr ds:[esi+ecx],eax% D1 V1 R' m$ G. u1 }
00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
4 s9 ^" X% y! F00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi# t& q6 d; s/ f3 [/ z7 n9 S- O
00B079AC 75 16 jnz short 00B079C4: R( F2 R3 c# I. Z- e% j6 y
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]+ C5 L& _2 B% D+ B# v0 Y, G
00B079B4 50 push eax* t4 F. Q' F6 y( V3 e+ N# E
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA- K/ y. _# U% P/ u8 M8 N
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]3 z P$ b; @& a+ c6 g" Y
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
7 t7 Y8 V- D- c5 @' C8 F. E/ d7 ?7 v00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
" K' J4 f/ Q$ G5 E8 x, }00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
7 s, u W" J2 n( L: ?+ S. q00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 ) Y" l, S2 X7 Y0 w( z; x" f' \6 _3 s
改为
2 y* J4 J& N& B$ \4 }00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA j! b. u: M6 B9 J* Z
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]* s L. A, d6 Z( h' b8 I* f
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
) A) r' A4 F+ P! M* Y; f00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]5 C1 I8 K4 }* g+ n( i4 s# E7 {
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
. _8 o& W8 L5 F00B079AC 75 16 jnz short 00B079C4
9 X6 V+ g8 X$ C) a# {00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
8 ^! U% c2 h' J! e8 O00B079B4 50 push eax7 i5 H4 H# J: A8 C% C- x
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA9 \$ B3 m7 r0 @* v, d& B
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]% w2 a$ c" Z9 _2 J3 ^
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax: Q4 }4 p l! a# J
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
4 n+ L5 {# A; c; p+ K) w00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
1 I' F9 P3 n5 p" p F) m00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z) " F6 K6 p2 k4 R% N% f
......................................................... ' G# O0 M; x" |$ M, y
清除所有断点。在401000段下内存断点,按F9
2 Z' f; j% p: U6 h+ f00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里2 Z* m. E$ \. k, `* m U
00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]( ]' r1 F7 h5 t% r' r. g1 ? h
00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260; Y; y4 F8 b( J( |2 \! T
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]
8 N2 N8 Q8 _3 ^4 ]: j# g00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952601 a. D6 C8 Q2 |/ ^
00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]
$ j7 s; M2 |1 V00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
7 Q7 o; L2 t& r0 M7 s. M P00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]1 y8 ?. z% |2 H0 R% r- F1 y
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
: y8 @+ z4 Q) m& M$ O3 h; p00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]
m6 z9 ], R6 a4 U提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。 . s3 x) M. F5 }7 e
天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置” ; U' h( G( A! s
想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。
! Y {" c+ t& W5 G+ M" e& v期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^ 9 V1 ^1 V ?' h a- Q8 \% y
后来还多亏wangli_com大大的指点。。。 - L! Y3 B" J2 g% c; b, Y# h# S
先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行 , g* W2 e( X5 W, f) O
77E7A6CF K> 55 push ebp //来到这里,F2清除断点& U- e& n2 ^# Q5 G2 Z0 V; }
77E7A6D0 8BEC mov ebp,esp7 y+ H) x& {$ c# ]& A! m; g! M
77E7A6D2 81EC 9C000000 sub esp,9C: e2 Z# }2 R* ~" o8 K, l
77E7A6D8 53 push ebx# u3 p$ Q F( }( g/ y+ [. y
77E7A6D9 56 push esi0 o! Q+ T# R r& t3 N* B+ B: g1 M
77E7A6DA 57 push edi |