|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。
) S+ W0 w. Q8 P. N2 }; P9 s3 P( i【使用工具】 Ollydbg,Loadpe,Imprec1.6F
4 D% ]+ l/ ]: K8 B【脱壳平台】 Win2K 6 W, t: N$ }9 ^/ v, ~" w
【软件名称】 按键精灵3 V3.11
: y2 _! u/ P; s* k8 k: Q7 O* b【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks : W* C" w( ~9 t9 r2 f" ^4 c0 `
【保护方式】 Armadillo CopyMem-ll +Debug-Blocker " L$ i/ z/ @/ m( C+ a1 |
【脱壳人】飞舞的T恤* S, e9 M+ Q1 q9 p/ r
-------------------------------------------------------------------------------- ( Z4 p+ j% O) E' ^; L# W
【脱壳内容】
$ _, Y6 }5 |# A$ p小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。 0 _2 h$ t7 l" X9 ~
小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 % H2 b, }7 s- ]' I& K
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
& i1 J( y. ?* o; R! w, ^6 SOD载入程序,插件自动隐藏OD,忽略所有异常。 7 t" b y: i: D. ~: E% j
00485000 按> $Content$nbsp; 60 pushad //外壳入口
( h- U/ s4 Q" |9 ]; ?8 d00485001 . E8 00000000 call 按键精灵.00485006; q4 ^* r- b) i& W2 _* \7 L
00485006 $Content$nbsp; 5D pop ebp
/ {* @+ c/ o1 }) e4 O: n4 x00485007 . 50 push eax
8 L2 h" y! u( u4 U( X, Q, _, I00485008 . 51 push ecx5 Q d/ N9 p2 o4 P
00485009 . EB 0F jmp short 按键精灵.0048501A
- s4 v! u3 L- f: q- O..................................................................... , s. H( K# m# l0 i# x% b1 P
命令行下断点 BP OpenMutexA,F9运行。 ! A: X! T4 ~- X2 U! b
中断
( W" u9 g% ^3 @. m. f77E6C503 K> 55 push ebp; c8 g' D$ X2 X( e; M
77E6C504 8BEC mov ebp,esp
% o8 ?8 Q0 C7 l3 G0 F4 L77E6C506 51 push ecx) F' B( w- J, Q. N7 T& T3 ^1 u
77E6C507 51 push ecx
+ p% r9 X: Y! y& _3 X! a' r7 J. B77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
" I2 _7 @7 l8 Y77E6C50C 56 push esi. X. a* c: q. o
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
' y# y) a# E, P7 U- ]3 i% f9 R.....................................................................
4 L" H0 G4 u e5 x$ w' W堆栈内容
/ ?% g& F. d# t K' k7 ]' x2 |0012F574 0045C5F1 /CALL 到 OpenMutexA8 P! |, I* E. G
0012F578 001F0001 |Access = 1F0001 R1 ]) L" u! F& Z
0012F57C 00000000 |Inheritable = FALSE
' h) Z, |/ f: x) v {: ]& ]* e0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。
$ A A( J* o* m找一块程序领空空地址,写入一些欺骗Arm的代码。 ; D. E. Y' G2 A
Ctrl+G 401000 3 S' p0 C$ c4 H# y8 I) L: `8 f
00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。7 v7 V5 b/ y* A. [- p
00401002 0000 ADD BYTE PTR DS:[EAX],AL! Q( X( u& A/ U6 o M
00401004 0000 ADD BYTE PTR DS:[EAX],AL
. ]; F ^ [9 T# p+ d# G; c3 h00401006 0000 ADD BYTE PTR DS:[EAX],AL% i G( h% {- T2 [* \
00401008 0000 ADD BYTE PTR DS:[EAX],AL% _ M$ ^8 t7 }
0040100A 0000 ADD BYTE PTR DS:[EAX],AL5 h+ r3 W5 m) A- v2 J+ Y/ Z
0040100C 0000 ADD BYTE PTR DS:[EAX],AL
5 d' v; l) w6 Z1 c2 m: n0040100E 0000 ADD BYTE PTR DS:[EAX],AL
# F& Y: I1 p& v7 E$ S* NOD直接双击修改,填入以下代码。
- ~: r7 x5 q( \/ q* u5 k00401000 60 pushad
' g% w; K. K( R% s+ }% c0 v3 ]2 b00401001 9C pushfd. ]4 A) D$ O7 p& y; [- O
00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"
y$ v" D; _% O4 B3 H00401007 33C0 xor eax,eax
/ g9 r( Z8 p* G% X: l5 z0 U/ c00401009 50 push eax
( v- l' P) J7 `$ V8 E& @- W" V0040100A 50 push eax
7 g. n1 d: C5 L z0040100B E8 6D97A677 call KERNEL32.CreateMutexA9 J7 s9 C, d6 ?4 r+ p2 [
00401010 9D popfd5 D5 D& D( V2 z
00401011 61 popad
; ]- w1 @8 G0 B# A00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA
, i& d$ }: y( X% F............................................................
' e# Z* `9 v+ a! x$ \将当前的 Eip 77E6C503 切换到 401000 来。 - Y x9 X8 ]3 {8 S& m. C5 B
点右键 选在此处新建 Eip ,看到Eip 变为 401000
0 i+ f4 v1 T* A- n! ^F9运行。 1 s5 W: j3 S- j$ H# C" K# g
中断 F: {' x0 h9 ?4 @0 X! Q1 g. O
77E6C503 K> 55 push ebp //双击它或F2清除断点。
7 p' k, E+ H# u. ^ }77E6C504 8BEC mov ebp,esp8 D$ l \3 q: P* F
77E6C506 51 push ecx0 j; @ U" N2 `$ f
77E6C507 51 push ecx3 o! G0 G- `# L& q; ^
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],07 W9 w+ Z! `, [* \3 h% h5 K }! g! H
77E6C50C 56 push esi
: S L: c" I4 k( p; m77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
* ], x. V- F$ [6 ^/ l4 O, j............................................................ . T* ]0 k4 d8 b0 @/ v
找 magic jmp 命令行下断点,bp GetModuleHandleA
: S9 s: Z. f" U" F77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。/ K' I$ `) K. J1 k' V
77E63DFD 8BEC mov ebp,esp2 `5 U2 K' `" |& n4 }# |
77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0) w$ `; S; Q9 R, z( b' z! F% A6 O
77E63E03 74 18 je short KERNEL32.77E63E1D
; O+ x( v/ M8 u) r) R2 k4 p77E63E05 FF75 08 push dword ptr ss:[ebp+8]
, y i! L8 F2 K) X: q1 b# ]77E63E08 E8 87FFFFFF call KERNEL32.77E63D94" y) h1 r% _! M/ Q. u
77E63E0D 85C0 test eax,eax
4 `$ C; F8 {" O! x) a77E63E0F 74 08 je short KERNEL32.77E63E19/ u0 Z& G& A: P1 M: k4 B
77E63E11 FF70 04 push dword ptr ds:[eax+4]
B5 T) S8 @2 _' T0 \! `7 o _77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW
9 E" a9 k# M& b2 o. E- z/ |* S$ n77E63E19 5D pop ebp3 _! a2 T% i8 p: E+ x3 L9 s, y E
77E63E1A C2 0400 retn 4
" W2 b9 b6 Q% y& n........................................................................
- g! C* g* m- L, l" aF9运行,多次硬件中断,注意堆栈值。
/ S: }8 C9 a5 W7次F9提示一个非法指令错误,Shift+F9忽略。
) d0 \3 j) e* N0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C8011 L; D' f0 s+ m* n
0012BEFC 00B2D6C8 \pModule = "kernel32.dll"& p9 l6 k/ m4 E/ V6 x
0012BF00 00B2E67C ASCII "VirtualAlloc"
( I Z4 R: L: J2 o0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
/ V# Y# j" P+ d! s0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
0 `0 S1 o8 R3 @+ r: N* k$ c) ~) w; u3 f0012BF00 00B2E670 ASCII "VirtualFree" + J1 H4 @( W9 ^+ c7 A
9次F9提示一个非法指令错误,Shift+F9忽略。
/ ]" |- m6 T/ U% C; s堆栈内容 " c& m9 L. ~* J* A7 ~* k4 S w
0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995
/ x$ s, j5 u$ a0012BC74 0012BDAC \pModule = "kernel32.dll" 5 n! i8 T% L1 t$ s
点调试菜单,里面清除硬件断点。
1 g( _- Y i) e+ qCtrl+F9 返回。
! s$ X6 c0 \& ]+ h) ^6 W M00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA5 B9 b, S8 a( H7 j3 t$ z
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]7 f2 t7 k3 f4 ~% o; S
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax( c4 A9 L, X2 G- D' r6 Q
00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]/ m0 z8 t. r. _* b, o H2 S! X' f
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
. O* W1 T8 ]# J5 O% G00B079AC 75 16 jnz short 00B079C4
+ j3 D* N1 R+ v; P$ X/ ^$ {00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]7 \* e. g2 G6 K& J9 `4 B
00B079B4 50 push eax
; B* m/ [/ v$ h8 t3 L6 D00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA8 k8 ?. W; f' {2 _! m+ S
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]2 N7 O6 l* S4 n( I7 K% M" t
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
, c+ M+ K7 y) n" B$ L% O00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
. L% Q) H. o6 `( k1 a, y00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi1 [1 S2 q! O) F1 T: ]
00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 ; ]4 o) m) s# f7 G
改为 # B8 n7 F# q/ w
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
" y! _: ~7 W6 G( g6 k0 k+ R# x& s00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]2 P6 |8 d* g% ]0 S
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax H* O' v. T4 d* u
00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]4 F0 d L& o" l, W$ u3 ~9 W" b! B! b
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
' \9 U4 B' R( }$ I00B079AC 75 16 jnz short 00B079C4
+ _ o* ` {5 o+ F1 r2 e1 O00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]1 M' G4 z7 D4 Z4 i, |/ N
00B079B4 50 push eax9 A K `9 o7 Y) [+ l
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA6 y- I9 Q( z( x K. A
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
8 P. \* a6 V4 p) K6 A! T00B079C1 89040E mov dword ptr ds:[esi+ecx],eax8 T/ _* m6 t8 v* q( q
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]6 g4 g" G( W. c( w$ d& A* c' ^7 `
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi' F0 I/ G, I% G3 Z
00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)
& {; Z: v" q; p4 ~, }- S4 Y......................................................... ! \: W8 c' ? ?/ z5 C
清除所有断点。在401000段下内存断点,按F9 % n) U, @% K2 g1 p
00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里) E0 h. A3 ]; ]5 v& J5 S
00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]
; s" U" O @9 F$ }% u$ Y00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
; w$ @9 f. N8 J( b P00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]/ L/ J9 K1 j9 L0 Y! X3 Z
00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260( ^; S% w/ x) v! @/ M& w- I
00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]+ ?4 ~5 V5 {$ w) H0 |
00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260- Q1 a$ `8 h# Q1 x% |2 {. [
00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]: D' ~5 n+ n% u- V0 `
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
( c# i* o6 G" o0 `( O( B7 S* u9 w00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20] & x5 {, H" c+ U5 E' v: e
提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。
. p; l! z; v% c* y: q5 m8 p" F+ Y天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置” $ _7 B* A. U$ O, ?$ {' l$ Y, B
想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。 ) X, {7 J& P6 F( T; L
期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^
/ |3 }( }$ n' M+ G2 ?3 A3 T后来还多亏wangli_com大大的指点。。。 0 }, @# ^; i5 a' {. u7 u5 U
先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行 ' e$ z6 o6 X& e# b8 m' G7 M9 e
77E7A6CF K> 55 push ebp //来到这里,F2清除断点
+ J) p/ V e& z1 B77E7A6D0 8BEC mov ebp,esp
. F6 _% p% n5 X7 T# o8 b77E7A6D2 81EC 9C000000 sub esp,9C
$ s8 o% ?' T c9 t9 G8 }3 O77E7A6D8 53 push ebx1 l' L7 j2 X( L5 I- w. q
77E7A6D9 56 push esi" P. O6 G( z3 A3 G+ i5 Q5 N% |
77E7A6DA 57 push edi |