|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。
7 X: A" B( Q# A& \: H: r, B【使用工具】 Ollydbg,Loadpe,Imprec1.6F
; S) a9 M; o/ G7 n【脱壳平台】 Win2K & V- @) O8 C# K
【软件名称】 按键精灵3 V3.11 6 R6 @ n$ T3 E! f
【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks 6 H1 p2 L4 x# |8 s9 s
【保护方式】 Armadillo CopyMem-ll +Debug-Blocker
! f3 S! }( Y1 @1 A0 q, i* t% W【脱壳人】飞舞的T恤8 _( P1 d, O, Q( K' p$ d8 ^ G
--------------------------------------------------------------------------------
. J& Q2 b: {' V8 X8 N【脱壳内容】 * [& F- u4 H! j$ [
小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。 * w4 w* y' v; S) g( H# N. ^; p
小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 , M! Z" I/ F6 v/ D/ C; X
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
6 t9 x7 } T+ k- K; M8 V# U( y3 nOD载入程序,插件自动隐藏OD,忽略所有异常。
, F) y: |* z( o& ], Z; {0 i00485000 按> $Content$nbsp; 60 pushad //外壳入口# O; Q6 ?" @7 \
00485001 . E8 00000000 call 按键精灵.00485006$ C! V4 Y- x9 U5 a8 d
00485006 $Content$nbsp; 5D pop ebp! X3 s1 w" |" d4 |; F" {$ g
00485007 . 50 push eax8 e# a/ x: J- q3 @% z6 X) N
00485008 . 51 push ecx
8 ~/ K( k' }! C! J. A00485009 . EB 0F jmp short 按键精灵.0048501A( r- O% a4 z6 H9 `0 Z4 R7 Z& [
.....................................................................
3 P2 p8 E' f8 r f" ~; J& C命令行下断点 BP OpenMutexA,F9运行。
& R; V# F8 V6 X/ ^中断
* |$ I8 w+ T. ], h# G: s/ ^' u6 z77E6C503 K> 55 push ebp5 M- [" P( w8 J1 Q" n
77E6C504 8BEC mov ebp,esp, F; U! T, A& {2 Z0 H+ R
77E6C506 51 push ecx
; i8 s+ b- ~ n2 f1 m$ `77E6C507 51 push ecx( L; p( Y- J+ l9 E* m8 d& q
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
/ q& }* k {2 T; o77E6C50C 56 push esi
; P1 m, e# Z% W; B) T) v6 U77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
: F- u6 i, m+ V+ F0 ?$ n.....................................................................
% ?3 l9 ^5 | Q* }堆栈内容 / a7 p' F b5 C$ S
0012F574 0045C5F1 /CALL 到 OpenMutexA3 t- v- i( Z" K# J r/ P9 ]' }1 g; O
0012F578 001F0001 |Access = 1F0001
% ^- C8 J5 _+ Q2 w0012F57C 00000000 |Inheritable = FALSE
) _1 m' N- N+ Z$ \$ Z' H; ?0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。
: R z% b, }) p: R& F找一块程序领空空地址,写入一些欺骗Arm的代码。 , N; \1 E1 C J& u
Ctrl+G 401000
3 l+ M, i# t! M0 c! `00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。
% ] b0 |( F" x M) \) X00401002 0000 ADD BYTE PTR DS:[EAX],AL
/ D. [* x" d* \/ m9 R% I00401004 0000 ADD BYTE PTR DS:[EAX],AL/ A7 e5 F: E& X: I
00401006 0000 ADD BYTE PTR DS:[EAX],AL
0 E; K6 h7 b' x, d00401008 0000 ADD BYTE PTR DS:[EAX],AL
& r% m) z( D( e \8 s# j# e8 e$ y0040100A 0000 ADD BYTE PTR DS:[EAX],AL
/ u) X: \* L3 x0 U0040100C 0000 ADD BYTE PTR DS:[EAX],AL9 C( U, {7 Z& s, q2 U% n9 O* s
0040100E 0000 ADD BYTE PTR DS:[EAX],AL
9 ?) |! ^+ N g# J1 |8 QOD直接双击修改,填入以下代码。
# O3 H4 ^5 V6 p. p6 ]00401000 60 pushad0 S- n- r# r' M" ^ l
00401001 9C pushfd8 w; W, P; [- ^+ ^. {" b+ c
00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"
" Z4 M8 B5 X( q( K5 h$ X6 m00401007 33C0 xor eax,eax) A" h2 G8 g1 p
00401009 50 push eax% ?9 |1 c' U6 l: B5 n- z* N0 z3 _
0040100A 50 push eax
5 S; ^9 W7 {4 X, |. D" c0040100B E8 6D97A677 call KERNEL32.CreateMutexA/ y) h* ]# D+ q4 a
00401010 9D popfd
# V2 U/ C6 }% R j6 R+ P2 ~00401011 61 popad
" D1 V% w8 R+ h( D0 J1 q00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA
/ c- `) d8 Y* G5 n1 W* I............................................................
1 T- J# b& b* P7 d1 P将当前的 Eip 77E6C503 切换到 401000 来。
8 G6 j0 }0 L7 S, r& s- `点右键 选在此处新建 Eip ,看到Eip 变为 401000 ' V5 w# S4 B r+ [
F9运行。 - y3 W5 X1 Q7 q) x0 q9 l8 F
中断
' f9 Q: ?1 ]* N* W3 { K9 N77E6C503 K> 55 push ebp //双击它或F2清除断点。3 J- D* G6 S& r8 O9 r+ a0 p; t- H2 C
77E6C504 8BEC mov ebp,esp
7 J5 S1 R7 C' H; `77E6C506 51 push ecx
" J4 N& I' O/ h$ c5 l77E6C507 51 push ecx
! s- Y/ ]6 n y. k3 z77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
) s) v+ I9 S# e9 H1 ^77E6C50C 56 push esi
, q7 o3 y3 X! j1 M, c77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D2 _: |9 k% ?2 h' m% P S, y
............................................................
. b, x6 w* D+ ~: ?; h找 magic jmp 命令行下断点,bp GetModuleHandleA
0 N5 ~2 j; a0 `9 k$ \77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。2 M/ J3 P! t4 f8 x8 e
77E63DFD 8BEC mov ebp,esp; \+ P7 w% m( G; v- Q8 _; s
77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0
! ^$ [' p2 _7 T, y @* Q77E63E03 74 18 je short KERNEL32.77E63E1D
* o2 S! ^% h# J3 z: z+ D1 ?! X9 H77E63E05 FF75 08 push dword ptr ss:[ebp+8]
/ s# Z* y; O( v; }9 L77E63E08 E8 87FFFFFF call KERNEL32.77E63D94* f9 c) h% J9 F$ X K2 N. L
77E63E0D 85C0 test eax,eax
( g! x Q7 _9 d% `& N) F77E63E0F 74 08 je short KERNEL32.77E63E199 N5 z. Z8 T' X, e% f0 _6 R
77E63E11 FF70 04 push dword ptr ds:[eax+4]7 @3 d" q, p: i( _% r" [ R9 u: w5 B
77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW+ H& B9 l ?6 |5 _5 R$ W
77E63E19 5D pop ebp. Z U+ M/ k% p$ h2 d. Y# p
77E63E1A C2 0400 retn 4
) z" q( l, \5 v3 A) }........................................................................ z! I% o4 X* }
F9运行,多次硬件中断,注意堆栈值。 2 F: K! u# z( [+ w0 q
7次F9提示一个非法指令错误,Shift+F9忽略。, J/ m& I7 s( M8 k+ e
0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801
7 p5 H: V \: d- Y* d0012BEFC 00B2D6C8 \pModule = "kernel32.dll"" h* n3 A7 g6 P6 d
0012BF00 00B2E67C ASCII "VirtualAlloc" 5 r; h! T. G% ?
0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
2 Q* R8 b" T0 Z1 M0012BEFC 00B2D6C8 \pModule = "kernel32.dll"2 T, ^' _' b' b$ E
0012BF00 00B2E670 ASCII "VirtualFree"
3 L6 c+ Z* {0 V) C0 ]9次F9提示一个非法指令错误,Shift+F9忽略。
1 i0 X; Q. d* d" L: L6 ~+ \" o+ X6 d/ f堆栈内容
* g4 b- Q# B: d! W0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B079958 v, s4 d0 [0 m
0012BC74 0012BDAC \pModule = "kernel32.dll" 1 V0 O; A8 `% P9 p
点调试菜单,里面清除硬件断点。 2 M; [% w! K1 e) J
Ctrl+F9 返回。
+ `! G% B: b) @/ y00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA0 }' B2 @" G+ F7 N* K8 K& r
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
" h2 p ~4 M. d- I! Z; r0 [& J00B079A1 89040E mov dword ptr ds:[esi+ecx],eax5 B9 e Z. ?; G$ G$ W/ y
00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]6 b( m& @) u7 S& d5 [3 P$ T4 c
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
$ O* c9 u8 a* h, A8 Q2 O00B079AC 75 16 jnz short 00B079C4
8 }0 e$ y; h. _4 E00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]- A6 f! [) t6 P. c
00B079B4 50 push eax
9 c+ ^5 a& u0 v8 l. U" r00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA
) ~! R) V5 Q+ i' Y00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]5 C& I5 r. S- j; R
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax, D" e3 b+ }3 o0 N2 E8 H
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]9 b" F# p* l# A
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi" [" r% A7 D7 G
00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 , q4 W& F; k2 P1 |" F( c5 y" t
改为 # c( X6 U" C/ m9 p
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
- D% [7 h3 H# ]0 r7 h. O9 c00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
# f% L6 l }, n) J, c7 ~$ Z; K00B079A1 89040E mov dword ptr ds:[esi+ecx],eax+ G1 @ b( b/ w/ M. H- |# _$ E
00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]5 i! u5 F1 u% f4 n5 y; ?; u
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi( a9 j f+ R! O
00B079AC 75 16 jnz short 00B079C4
4 g' C0 y$ L, m; |& L: p3 f$ b# I5 q00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]+ w* e. E! k/ y/ E# m
00B079B4 50 push eax
. `4 m$ F& k. ]3 {4 Y00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA
+ N3 W: T }5 k1 C+ K i4 F00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
2 b% r; w0 z+ q: ^; `; K00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
0 _& M4 D6 `& W3 B V00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
9 W8 _: m C7 _" ]2 p: k2 K8 j00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
! o, a# _6 C6 f. P3 \: r00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z) " Z+ B6 K* K2 A3 V0 p& y
......................................................... * G {+ V9 N9 R0 k5 s6 @9 d: j9 w" D
清除所有断点。在401000段下内存断点,按F9
$ e& g" S% b, C+ L G00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里
" e! J8 p1 \; X" w: g: p! }00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]
) b( L; O- q& U0 `6 A8 Y00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260! ~* I; u& O, J1 N+ m0 S
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4], w* E" R& s& C5 h' d5 u* Y, q
00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
4 A5 n* y A7 i I8 _2 r4 ~0 n0 G00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]
1 {" a6 o) _, O00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260% F; g& G, f k- o
00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]5 p0 J7 K& ~5 |0 _8 q
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952608 Q6 r2 B: {$ l) u
00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]
- v6 g( B5 L! m5 d/ \3 C& X/ K提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。 1 r" o; r+ A- I% a
天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”
/ c* P6 y/ T% _& |. g' o5 A想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。 V/ ^# J/ z+ Y3 Z2 b' }/ J
期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^ / ?2 P C, q5 Z0 \# s! r
后来还多亏wangli_com大大的指点。。。
8 j$ O4 V0 d9 M, P O6 d/ Y先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行 6 Z9 @$ ]3 Z) S! x: ?( P' ~: V
77E7A6CF K> 55 push ebp //来到这里,F2清除断点$ F0 H0 q9 q1 T2 n/ ~) r! ?) [ Y
77E7A6D0 8BEC mov ebp,esp
* N4 _- M3 H6 t8 b77E7A6D2 81EC 9C000000 sub esp,9C
* r; _% Z( u; r, ~" ?! A; F" {77E7A6D8 53 push ebx
" O3 I; M& t. M6 g77E7A6D9 56 push esi% n+ F6 ?# G7 a7 q
77E7A6DA 57 push edi |