|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 ; Q: p0 I2 V. n7 _$ K
【使用工具】 Ollydbg,Loadpe,Imprec1.6F
* {# `: X1 r% J9 |/ X# l【脱壳平台】 Win2K
; ?( u8 q/ e; [* N: |# G【软件名称】 按键精灵3 V3.11
: u' t9 ?( }* y1 ]) V# w* H【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks
7 A0 k$ c- t( u" S5 E! V【保护方式】 Armadillo CopyMem-ll +Debug-Blocker
5 B' I, g r( v7 v) L4 S6 d& J【脱壳人】飞舞的T恤8 {9 n( K, }( W* C; `- m
--------------------------------------------------------------------------------
6 u4 W) x8 P2 a; f【脱壳内容】
4 G$ l9 @" A+ C9 _; ?3 N! q: Z" ]小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。
- H4 ?& w, C2 z3 d* p2 q- w* ~! v小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。
' w+ L- o% v) [; D9 S4 A用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。 , [7 ~3 j1 _3 k
OD载入程序,插件自动隐藏OD,忽略所有异常。
6 z: W" e- G6 q! `5 r) `00485000 按> $Content$nbsp; 60 pushad //外壳入口
: t4 k* T# D+ V% q# z00485001 . E8 00000000 call 按键精灵.00485006
% r" Y: d' y8 g! F) ?00485006 $Content$nbsp; 5D pop ebp
: I. t8 ~1 W0 Z00485007 . 50 push eax( g$ J, q7 x/ x) V$ X% D
00485008 . 51 push ecx: c4 A9 C& N- Z9 h/ [
00485009 . EB 0F jmp short 按键精灵.0048501A/ r! T; R3 y: |# m6 i
..................................................................... " F# p. c0 P0 t3 {8 ~+ Y
命令行下断点 BP OpenMutexA,F9运行。
3 S: ]# @; y! {中断 ! l6 B* g) L" _2 z+ ^2 U
77E6C503 K> 55 push ebp2 o8 c' ~+ i" b" w% I6 I
77E6C504 8BEC mov ebp,esp' A9 H* G/ S2 M o7 a9 M2 C
77E6C506 51 push ecx9 E- i- q0 s* B$ t% H5 T
77E6C507 51 push ecx( N4 h+ y5 H' P8 d5 L' w
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
& k. G2 y% j4 ?- t* t77E6C50C 56 push esi
6 q* A/ r1 H: q. K0 G9 F0 ^: u* Q/ k77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D/ f0 x- x0 D& a% o! H
.....................................................................
3 q1 i& N) n8 C; X0 U! D6 k堆栈内容
2 a Z3 o4 C& O0012F574 0045C5F1 /CALL 到 OpenMutexA6 C% \5 Z/ }& q: j
0012F578 001F0001 |Access = 1F0001
. E. h# A: H) O( i y0012F57C 00000000 |Inheritable = FALSE
, f) f% W* o5 C7 i7 ?* @8 S0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。 ) E8 q& C! Q5 ]% t" x- C3 c/ E* W
找一块程序领空空地址,写入一些欺骗Arm的代码。
2 {. O8 ?* s2 K4 @3 E& ZCtrl+G 401000 q) C4 j, k( C' a! l0 x" p
00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。
7 N' @' T' S6 |7 w2 t00401002 0000 ADD BYTE PTR DS:[EAX],AL
$ {5 P2 ~, A) r' T* Z00401004 0000 ADD BYTE PTR DS:[EAX],AL, I# n* Q* A8 y
00401006 0000 ADD BYTE PTR DS:[EAX],AL
" }5 v* j0 i2 I( U0 y+ b1 Z00401008 0000 ADD BYTE PTR DS:[EAX],AL
7 d4 R+ q% u, ~; t: L0040100A 0000 ADD BYTE PTR DS:[EAX],AL' H# I ?9 ]$ i7 A: I
0040100C 0000 ADD BYTE PTR DS:[EAX],AL
) T% U4 K! g" U; j( [0040100E 0000 ADD BYTE PTR DS:[EAX],AL
; {' g" Q4 @! r" u9 vOD直接双击修改,填入以下代码。
0 C$ ~, Z/ z# i; D* m00401000 60 pushad0 y1 _$ @" O; _% T; h# D+ |- i2 M" }1 u
00401001 9C pushfd# P# m) P, p# g N0 D( [. R
00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"
2 N6 h4 V! Z; p2 C% I: c0 k00401007 33C0 xor eax,eax
8 f& P4 J. u. U4 D0 `. _00401009 50 push eax! }. r4 P0 P# a4 a& ^' S
0040100A 50 push eax
( V) @/ D% t. ~0040100B E8 6D97A677 call KERNEL32.CreateMutexA5 @0 Q. j- m3 @
00401010 9D popfd
9 {; i- x- r+ c* E00401011 61 popad4 V2 V* m( U+ Q" J# W: s
00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA9 u9 c: t6 I% d+ e
............................................................
k% e* _& |* q \ z' u* \将当前的 Eip 77E6C503 切换到 401000 来。 m9 A* T N0 `8 j: R2 f
点右键 选在此处新建 Eip ,看到Eip 变为 401000
8 z1 N9 t3 V8 x, q4 G4 xF9运行。 6 P7 Q; `; K# B. l+ N! ^' o# u9 u
中断 + a9 [3 i( w: Q* H1 f+ w$ N! g. x
77E6C503 K> 55 push ebp //双击它或F2清除断点。
% I7 b$ L& a, Y* Z6 ^77E6C504 8BEC mov ebp,esp& [: j- h: l" q
77E6C506 51 push ecx# h% W, i6 T# U! C6 G1 S& F: j
77E6C507 51 push ecx
* [ P6 g7 ^ d1 `" m7 J+ C* A% G77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],09 a% {, a& h" s* ?
77E6C50C 56 push esi
- Q) g0 G* v7 S6 }' \! G' u( P( l# K77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
" a5 O3 [ A! ]4 }9 S& ^' j............................................................ ; S- L4 A2 q( h5 r4 ]
找 magic jmp 命令行下断点,bp GetModuleHandleA " c; F0 U u/ C
77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。) e: L9 r+ Y/ _8 D b, l
77E63DFD 8BEC mov ebp,esp5 F, N h! f* l* Y( S* E, S3 ?
77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],04 D: J6 Y# j E: N$ V* c( h2 L
77E63E03 74 18 je short KERNEL32.77E63E1D
8 ]9 u$ V& D0 R2 r" @$ w ~77E63E05 FF75 08 push dword ptr ss:[ebp+8]
8 H1 N& S! Y* `& x d7 L77E63E08 E8 87FFFFFF call KERNEL32.77E63D94
% N! @# K4 a2 G6 [: R77E63E0D 85C0 test eax,eax
9 L# ]0 s# p ] R% J1 r77E63E0F 74 08 je short KERNEL32.77E63E196 p3 k/ q; Q+ h7 S$ U
77E63E11 FF70 04 push dword ptr ds:[eax+4]
8 r9 a& y: C4 u9 A. u7 O77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW
1 w/ j7 r! c+ P7 p# B5 u5 ]77E63E19 5D pop ebp; E7 Y, o }/ h, u+ S/ W+ K
77E63E1A C2 0400 retn 4
$ L1 W. g/ H2 i........................................................................ 1 h$ C4 q5 h+ _0 ]2 {, I6 \
F9运行,多次硬件中断,注意堆栈值。 " I l: P! D+ A+ a [4 E; w! u* f
7次F9提示一个非法指令错误,Shift+F9忽略。
% x C% a! a5 q" c3 H$ J P# G0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801
0 `/ U3 \: x p; n' w0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
; f& ^% [) E, j5 g0012BF00 00B2E67C ASCII "VirtualAlloc"
+ r$ M% `+ E6 E( V' Y& ~- n3 h7 D0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
8 G4 x. C/ \6 {' E- M0012BEFC 00B2D6C8 \pModule = "kernel32.dll", O& X8 M6 O$ M/ r
0012BF00 00B2E670 ASCII "VirtualFree" + ? e0 M* T1 y. S7 ]# Z
9次F9提示一个非法指令错误,Shift+F9忽略。
- J6 U& k% c/ c' c; w) N# Q堆栈内容
4 F% {6 f( V5 J* ]9 S8 D0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995
, |8 s5 a( h- R% X0012BC74 0012BDAC \pModule = "kernel32.dll" 7 R, X( T$ `( r
点调试菜单,里面清除硬件断点。 6 g k, \& o$ O" Y, k7 W& A
Ctrl+F9 返回。
& q7 d f9 E6 V00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
! f( i0 R/ y3 e* `0 Y) t00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]+ e% L3 _4 T/ p/ L! J
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax- a/ w; C' L) T* N9 j
00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
4 j; V9 t/ M: a00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
8 t( v) I+ t4 [( l( t00B079AC 75 16 jnz short 00B079C4
' W$ l# O# Y2 b" X+ n& r00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]! n" z* a# X7 s; u8 K; u$ @
00B079B4 50 push eax, c- a3 k6 }7 u4 E- ~4 `( E6 d
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA# z' l$ d' E3 u; H+ Q
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
5 v6 a' k1 t% ~, B/ ]0 F+ ~00B079C1 89040E mov dword ptr ds:[esi+ecx],eax! v. b9 w0 @( B' `. _( U
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
9 k" X1 A. b2 j00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi" C( z. b& m; W* V4 y
00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 : j" f$ O7 L: }
改为
, K& p$ I# b2 @: o00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
9 b! K6 G3 ^& _2 o8 T) U0 ?; x00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
3 g$ |7 M4 E* v- Q00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
2 g; W% f" b( |. R& E00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]- P% h- }5 W) S2 t ]" _
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
9 U8 {, P, @+ Q! q6 Y00B079AC 75 16 jnz short 00B079C47 ~$ n) m3 g# A- @2 z# X
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
2 [* J1 L0 V5 q& a7 E4 A' _$ j00B079B4 50 push eax/ C1 @+ {5 ?# \* L
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA' p) \, z0 W# O3 W Y
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0], t" j. L$ q; e) O- E# z
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
# [( m. T4 I6 ~/ q; g00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]' ]: T( `7 Y$ v, ?& x
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
, c5 _2 G# L# [- ?/ H0 C3 ]4 `00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z) 3 W" _3 u1 i5 q5 b# g
.........................................................
( S! i% O, u4 P6 u& x- i清除所有断点。在401000段下内存断点,按F9 2 K+ X/ N7 K8 s# L) V' @# s
00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里
Q1 g/ B3 ~1 X/ n00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]
6 v7 r, m+ [6 s& T# Q& F' G# p00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260. b0 C- n3 b2 e+ u2 y) f& x8 t
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]# D0 ?% j3 a! M8 X% G0 r
00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952608 t6 F/ K; }! K3 f3 X; C: @2 _
00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]
9 S+ A$ t d" u2 _8 V) v9 j1 S00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952608 j3 H" j C" p
00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]
& c6 i: x1 X! v6 ~2 d3 `# \4 G5 z00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260. ]& h. s* |8 S- {
00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]
. h0 H- H# A K/ L1 b, K提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。
& u7 u$ _" U6 J$ m. J天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”
. ^& @0 f/ O8 P2 P \! Y想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。
" _5 o# T u% D4 l, w1 J8 ~期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^
( J q% b- N* F9 Y5 Y) A! }后来还多亏wangli_com大大的指点。。。
# p# I) r" ^4 i先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行
: o7 N! r& ]* O/ N! j" ^77E7A6CF K> 55 push ebp //来到这里,F2清除断点8 g1 g/ |4 _6 C0 O4 F/ p/ ^
77E7A6D0 8BEC mov ebp,esp3 U2 x8 E1 B% O" z) I
77E7A6D2 81EC 9C000000 sub esp,9C. v' k& e5 T$ p7 b6 b; Z, I) `
77E7A6D8 53 push ebx h6 n6 u- V- k/ G1 A
77E7A6D9 56 push esi
# ?& G' V3 b/ U; @' ?% N77E7A6DA 57 push edi |