|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 ( b8 w7 \! ]4 T( v7 q8 E: {' r# X
【使用工具】 Ollydbg,Loadpe,Imprec1.6F
0 L: s- Y+ f, B【脱壳平台】 Win2K 7 F1 \2 N: ^5 P! ?+ |
【软件名称】 按键精灵3 V3.11 + o$ ]% j% j6 e! O8 n
【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks : [1 h+ w# m% ?% x* o. }: S5 z+ r
【保护方式】 Armadillo CopyMem-ll +Debug-Blocker
' H n; o8 F8 d( y. Y【脱壳人】飞舞的T恤+ G! P& ^% {% A3 l
--------------------------------------------------------------------------------
9 H! @$ q& T5 M# u/ N! L- z【脱壳内容】 2 u3 {! l/ |4 K8 k; U) V4 Q
小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。
; |/ F. w! `9 ^小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 1 I2 ^3 X) D4 a, _0 s0 i
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
q% M( Z' V: g2 @OD载入程序,插件自动隐藏OD,忽略所有异常。
( r% g* T3 t! J00485000 按> $Content$nbsp; 60 pushad //外壳入口
4 `% y8 q. h/ E00485001 . E8 00000000 call 按键精灵.00485006' q, b: s" \ X8 R
00485006 $Content$nbsp; 5D pop ebp- m) z, X t# H" Z t! k: K2 z) E1 b
00485007 . 50 push eax3 L- B5 [9 _9 q' w& _5 s
00485008 . 51 push ecx
- o3 t- k9 Q( M% S3 D* q00485009 . EB 0F jmp short 按键精灵.0048501A u( y" A% U8 r3 @& K3 \7 ]
..................................................................... ( }: @6 V' b K, P6 X3 w
命令行下断点 BP OpenMutexA,F9运行。 ) s( h# V0 h& L6 D. E: Y4 S( G8 t
中断 ( }) b* J( Z2 r1 J5 _5 L% M" Z
77E6C503 K> 55 push ebp9 l3 a. D* E5 c! E1 t
77E6C504 8BEC mov ebp,esp" g; v1 Z0 M! p6 I
77E6C506 51 push ecx
" [' k6 {+ Y' Y$ I6 I, e77E6C507 51 push ecx
8 J& t9 W5 |& U7 m' g4 [. W- H7 w77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],01 h* Q6 ~, l# J U- `0 E3 @
77E6C50C 56 push esi+ c- B0 v9 O" n% f- D8 G3 Y
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
( I: O* D: }7 E7 |..................................................................... " M) H3 |! w8 j3 w. o* I4 T9 _
堆栈内容
- T8 A4 x2 K8 i7 V5 ~; U9 r0012F574 0045C5F1 /CALL 到 OpenMutexA
: |- |" E9 I9 a) o0012F578 001F0001 |Access = 1F0001
N4 r1 `: k! N; A: j5 {0 J0012F57C 00000000 |Inheritable = FALSE
- w1 V7 r% _# \8 }0 A0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。 . {% l1 Y/ m; \4 _. t3 \& Y
找一块程序领空空地址,写入一些欺骗Arm的代码。 * {( k' T. \ _- j3 i* Q$ q$ ?
Ctrl+G 401000 0 K# }: q( V# M$ B# h2 E0 M
00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。: J y+ g3 u3 {
00401002 0000 ADD BYTE PTR DS:[EAX],AL6 ?+ T# t, e- N/ [. _
00401004 0000 ADD BYTE PTR DS:[EAX],AL# ~% v. Z6 N* u' {' H7 ~5 L# r
00401006 0000 ADD BYTE PTR DS:[EAX],AL9 P* S. |% p6 A; Z5 b
00401008 0000 ADD BYTE PTR DS:[EAX],AL7 a Q' I1 S1 E0 \; E2 |% Z
0040100A 0000 ADD BYTE PTR DS:[EAX],AL: l; X% m& U7 U- e$ D
0040100C 0000 ADD BYTE PTR DS:[EAX],AL( y. z3 p# Z- C
0040100E 0000 ADD BYTE PTR DS:[EAX],AL
9 x9 [% S3 G6 l( N- O5 pOD直接双击修改,填入以下代码。 * P: S4 _% r' u! @; a8 ]
00401000 60 pushad: D3 Z. k6 \% ]) w) \2 W6 n" p! ?
00401001 9C pushfd
! h) Y2 c$ c) ?' g00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"
. f$ n, D6 ?1 W00401007 33C0 xor eax,eax9 o/ K. j0 a) @
00401009 50 push eax w% x8 F6 R/ s1 V) c* X; f
0040100A 50 push eax2 o3 z$ c2 R. J4 `; s' E
0040100B E8 6D97A677 call KERNEL32.CreateMutexA
3 [7 H. \" J- M: I( h3 H$ ?00401010 9D popfd
7 \1 t4 S$ N" ~) W00401011 61 popad
; }: D+ D9 y4 @# o; j00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA
( r; Q$ _+ S/ @ n6 v............................................................ 2 @+ W+ h/ O) \1 Q% V
将当前的 Eip 77E6C503 切换到 401000 来。
2 m9 ^9 N; I" ^7 B点右键 选在此处新建 Eip ,看到Eip 变为 401000
, ?, k7 |3 l# u3 xF9运行。
) x$ _8 d* q4 @6 C1 S中断
1 j+ S, _ z( k% E! Z) v77E6C503 K> 55 push ebp //双击它或F2清除断点。1 n& z/ L( S/ R5 z2 T$ C+ |9 i
77E6C504 8BEC mov ebp,esp% ?. N1 {/ Y* m+ }2 d# b2 D& z
77E6C506 51 push ecx. F+ z9 N1 S7 y8 S3 R$ T
77E6C507 51 push ecx4 M+ Q3 E# V- O0 W
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
! L1 b7 ?* ?" s( y i9 b77E6C50C 56 push esi
3 d- j2 ^" ~) \77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
& r3 X# O0 Z/ |2 n* B, I/ N............................................................
$ G& v% ]" @5 O3 C" [找 magic jmp 命令行下断点,bp GetModuleHandleA
% O3 E, `% }/ r77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。/ ~8 c. U3 Q9 }, a
77E63DFD 8BEC mov ebp,esp
5 R# v- ?0 X0 v- j5 \77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],01 D/ {* O& P+ }/ n2 @7 Y2 W7 T+ r
77E63E03 74 18 je short KERNEL32.77E63E1D
9 b4 R& a1 \- K1 } `, g% M77E63E05 FF75 08 push dword ptr ss:[ebp+8] f( Y- E* i1 V) U# k4 {
77E63E08 E8 87FFFFFF call KERNEL32.77E63D94
- R6 N0 E. F; m# }- R77E63E0D 85C0 test eax,eax
9 P0 a9 {! v u! b0 r) q' o7 U77E63E0F 74 08 je short KERNEL32.77E63E19% O8 T0 o7 V' N) i" J1 O7 t
77E63E11 FF70 04 push dword ptr ds:[eax+4]+ G5 ^$ H& X# r, }1 Q
77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW2 d) ^- X# o- o
77E63E19 5D pop ebp
1 s# @" n* b/ b6 z- X77E63E1A C2 0400 retn 4$ l! g* t1 K1 C7 `
........................................................................
, s0 `/ N3 c, o0 r6 z* XF9运行,多次硬件中断,注意堆栈值。 / i/ w3 v1 z. F% g* f* B y5 E2 z+ l1 ]
7次F9提示一个非法指令错误,Shift+F9忽略。
0 a" T" t6 \* N# {5 x r0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801
G: D/ l# R5 ~+ K; V- P0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
& p0 p; y7 P+ K" E0012BF00 00B2E67C ASCII "VirtualAlloc"
4 \( x- U) |4 L6 g1 l0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
& R! \4 ~: m4 O* ~& F% m( L0012BEFC 00B2D6C8 \pModule = "kernel32.dll"4 _* x2 T2 _9 A5 C- c( M8 ?
0012BF00 00B2E670 ASCII "VirtualFree" / J) t q }( \9 N# d; S' H
9次F9提示一个非法指令错误,Shift+F9忽略。 ( ` p6 j4 G# V5 K' K4 q# R3 B3 B
堆栈内容 / H* t/ p/ i3 O7 _6 G
0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995
) F9 k( E% R& n& P! _6 l- ~0012BC74 0012BDAC \pModule = "kernel32.dll"
0 d P; Y/ x5 B9 ~. @+ M* E点调试菜单,里面清除硬件断点。
# F: e. Z8 I& V2 |: E4 [2 u$ GCtrl+F9 返回。
4 C! c" Y' }$ V' D7 a& E5 x00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA, v( Q, T# D( L( s
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
5 O7 A4 ^/ v1 [2 `00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
+ K1 A8 Z3 B9 j1 k00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]# j# R& h$ t; F6 z2 J
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi6 A ^- V! a/ f& C- N
00B079AC 75 16 jnz short 00B079C4
- ]; {- ]% ~( r# F) Y, ?0 z- e00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
! ]+ X8 K4 X0 _% {+ m: _+ H% K00B079B4 50 push eax- U# {/ L9 A4 x% [' R
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA0 t4 s( n5 B( \3 L0 L
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]5 l1 ]- U! R- l- G
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax/ g7 T! j/ c" m0 [1 A! O
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]! I2 ` r7 b% A/ V" H% p' T; H) i# H1 L
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi( e, d8 u: }9 v0 E7 z& h
00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 - t" b' @! g4 F' U3 w6 Q6 x
改为 U$ C4 m. D( R& G5 I; v
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA' R) q p: F: y. N( X
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
# D, n& t2 r) F0 E4 N00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
0 L7 \' W% D u% U+ j Q00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]: X$ ~4 G, [ }4 l& s
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
9 q6 q3 Z% p) H$ j3 f' n00B079AC 75 16 jnz short 00B079C4* I( z( B/ Q) x; y
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
+ a: H6 a, x# z& C7 d* f( c* b7 V9 Z00B079B4 50 push eax2 ~9 X+ `, g) d! r9 y' v
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA
8 ^7 } C/ O% n' E, T; }7 J00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] Z- c! U$ `8 {
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
& _+ H" W9 w/ o6 {3 n' I: _00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
% K0 `4 \ P- C00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
0 q! U0 v6 F$ x+ f00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z) 9 c8 T4 \. N: ~! ?$ [
.........................................................
/ K4 v+ O' V+ ]6 e+ ^清除所有断点。在401000段下内存断点,按F9 * [! {: W q, v( |
00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里+ G$ R+ @$ N! j4 W3 l: |$ s6 E
00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]
4 r6 R" v9 D/ M+ m5 H+ c00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
0 f8 D' C, h* ?- t" _00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]# f/ P. ~- y$ ~/ p. f
00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260% f! m l/ D+ v4 u
00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]9 ]4 o: Q5 V$ I7 r
00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260" o5 o0 Y) p* M6 Q
00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]7 E# M0 a, m# j, }1 H# }1 o
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260: d) U" d& j6 R' C
00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]
$ c( O3 g y/ e e @/ m$ l& R提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。
2 M; u5 ~. ]+ }2 S- A/ [天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置” ' m( b) U5 }7 |' h
想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。
. C6 F& f8 o% H+ t期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^ ( {( t" @, [) E0 U4 O1 p* s
后来还多亏wangli_com大大的指点。。。 9 r4 E% `! l4 m( a/ U) g( [
先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行 + t' D% e# \7 g5 n6 R/ @
77E7A6CF K> 55 push ebp //来到这里,F2清除断点/ A; _4 [& Q, ?4 X- \
77E7A6D0 8BEC mov ebp,esp
* [2 X! F$ f/ u& g* D$ f! G/ A77E7A6D2 81EC 9C000000 sub esp,9C) B- s! _" s: X, u( {6 u! |
77E7A6D8 53 push ebx
! J3 y0 J6 c4 D2 \$ C5 S77E7A6D9 56 push esi
) i _, U" H% L4 A; N, q77E7A6DA 57 push edi |