|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。
8 E8 O$ H0 V; b$ X: s【使用工具】 Ollydbg,Loadpe,Imprec1.6F 3 K- H$ s' Z a. s+ P% m& {6 t- u7 W
【脱壳平台】 Win2K
, ^* U0 e& J4 l5 t: _【软件名称】 按键精灵3 V3.11
+ c" o$ T' {1 R【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks
, C: \* k) ^( Y1 F【保护方式】 Armadillo CopyMem-ll +Debug-Blocker ) s! i/ ~5 e _' W7 K1 K. u
【脱壳人】飞舞的T恤4 @0 M6 i( g/ M+ r ?6 P
--------------------------------------------------------------------------------
2 d4 i4 n. p9 @3 z6 n' O: c$ j【脱壳内容】
# P' w* u* p2 ^6 v7 j小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。
6 `/ j" K# O3 @ p7 R1 }* \( i小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。
( m- X: F) V. @. t用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。 7 l" G: N& H7 z2 B/ _
OD载入程序,插件自动隐藏OD,忽略所有异常。 " y" j$ z- }* ?: x8 q9 A. P6 L, o: W: k
00485000 按> $Content$nbsp; 60 pushad //外壳入口
' @4 h' @. v* K00485001 . E8 00000000 call 按键精灵.00485006) B3 [, ^5 c# o
00485006 $Content$nbsp; 5D pop ebp
3 F9 C, p9 ?! W- z: G* t: M00485007 . 50 push eax
7 {0 Q6 t% D( f+ B, E! \00485008 . 51 push ecx
6 l# Z$ i" N* H; J00485009 . EB 0F jmp short 按键精灵.0048501A S& ^. W0 C( y) e0 P+ u
.....................................................................
# M/ S2 z+ `" K/ Q命令行下断点 BP OpenMutexA,F9运行。
$ O- i% i2 ^# }' Q0 H' B中断 / ?$ x0 @. |8 J
77E6C503 K> 55 push ebp
8 }2 a" b. x; X* U5 t! O) m77E6C504 8BEC mov ebp,esp
7 q: D' |4 Z4 X% z77E6C506 51 push ecx5 g' I6 S) R2 j
77E6C507 51 push ecx) F) J7 |5 R4 `
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0; ^8 ~" A l/ V( N
77E6C50C 56 push esi
2 a2 h$ n1 r! m3 L8 g77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D$ i: r# P1 I+ `7 k$ B7 T9 P
..................................................................... 7 \% n1 y6 A: X* i5 \' d7 K
堆栈内容
: ^' Y- [3 q7 k$ t0012F574 0045C5F1 /CALL 到 OpenMutexA+ O) D* e" P o, l5 V3 x- s
0012F578 001F0001 |Access = 1F00018 q8 _2 T. F6 [4 o# I
0012F57C 00000000 |Inheritable = FALSE4 `, A5 c! V9 ^8 n ]
0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。
( g2 e y b" |/ F" x找一块程序领空空地址,写入一些欺骗Arm的代码。
. T3 C# ^6 d/ ]+ j z8 q) O' ICtrl+G 401000 & H7 Y4 Z8 g; o+ E
00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。
# l; z9 o @" _2 V# x$ M& \00401002 0000 ADD BYTE PTR DS:[EAX],AL6 A# u& V* c9 P2 X6 {: Z% K
00401004 0000 ADD BYTE PTR DS:[EAX],AL
) b. X$ C# N, K00401006 0000 ADD BYTE PTR DS:[EAX],AL
" ?2 }6 ^# R# U. B i0 X) h00401008 0000 ADD BYTE PTR DS:[EAX],AL$ M& o4 n0 C# `/ j
0040100A 0000 ADD BYTE PTR DS:[EAX],AL
7 _0 F3 B8 |0 _: g- w5 C2 c0040100C 0000 ADD BYTE PTR DS:[EAX],AL
i8 A. a2 Y, |" w0040100E 0000 ADD BYTE PTR DS:[EAX],AL
; P, {' N6 K( B4 d! |0 fOD直接双击修改,填入以下代码。
4 H' i( G8 V: i2 ~" [00401000 60 pushad
+ X/ r8 m3 }9 J0 l00401001 9C pushfd
# f8 s0 J5 n/ X8 H00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"
8 }# C$ d7 b& `0 K6 h+ N% ]" e6 M00401007 33C0 xor eax,eax% D- a! P& ]9 c8 Z# X) ^/ N7 t
00401009 50 push eax# Y% f& u- T5 B7 J( \) U4 H
0040100A 50 push eax
* X- O! n' e* t% R" r, c* _3 M; o0040100B E8 6D97A677 call KERNEL32.CreateMutexA
+ L( \: {, e4 g6 p00401010 9D popfd
/ i+ s% v# }, `$ d00401011 61 popad2 Y. d5 r0 R5 V1 Q& [
00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA
3 G! p7 c: T; G1 m6 r: P* g............................................................ * F4 W" n1 b# f7 P. W+ _# X
将当前的 Eip 77E6C503 切换到 401000 来。 + l1 I8 k8 x. D( r/ E
点右键 选在此处新建 Eip ,看到Eip 变为 401000 % N" i# Q4 w2 {& B% s( E7 E
F9运行。 ) f, V- I3 X. x; M9 h
中断
3 v. z# w/ o8 F77E6C503 K> 55 push ebp //双击它或F2清除断点。
* @/ @) @6 g* Z77E6C504 8BEC mov ebp,esp1 V" v2 q/ [; R1 a) k
77E6C506 51 push ecx
1 h4 B. F! Y" X B6 E2 l77E6C507 51 push ecx) f, ]7 t2 I- F; l
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
7 t5 Z3 m6 ?# [* P. l! F77E6C50C 56 push esi
- i, G% g8 p4 }& W! a77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D2 ~6 ?; ?7 Y/ n% p4 c7 z5 N; J& u
............................................................ 3 j# u! u4 v& `2 g
找 magic jmp 命令行下断点,bp GetModuleHandleA % q- n7 c$ N9 C/ _6 T" O6 \9 @, [+ m
77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。6 o7 h: L% U0 u: S- F3 ~( N
77E63DFD 8BEC mov ebp,esp
8 E* A& s' V* J, }4 }77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0% R0 i+ a: t+ _; w1 v$ }6 U
77E63E03 74 18 je short KERNEL32.77E63E1D& J% Q$ u. P# k+ O5 w, h+ L' a! m
77E63E05 FF75 08 push dword ptr ss:[ebp+8]
! c4 Z7 r2 u# n4 f, R' ?6 n+ o7 l77E63E08 E8 87FFFFFF call KERNEL32.77E63D94% R$ z' u9 D6 [5 z+ Z& Q; z
77E63E0D 85C0 test eax,eax3 ~7 \' k5 h* G* x& y
77E63E0F 74 08 je short KERNEL32.77E63E19( Q( f% _: T( s4 Z( ?3 ?* Y
77E63E11 FF70 04 push dword ptr ds:[eax+4]
: ?0 J! W+ ^# U" K# P& i77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW
; V9 `9 I' U1 [/ |) \* z: D77E63E19 5D pop ebp/ L" I0 F6 F0 [% {
77E63E1A C2 0400 retn 4
" d4 F; h o5 G+ r3 B# t0 Z........................................................................
8 ^" K0 f) w7 @9 Q; SF9运行,多次硬件中断,注意堆栈值。 . I4 Q/ h0 t! q$ H0 j" U6 b
7次F9提示一个非法指令错误,Shift+F9忽略。6 G/ P* |, m$ p$ @+ ?' A
0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801. T5 M j2 d4 ~
0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
. _7 z+ R3 E% }; N4 c0012BF00 00B2E67C ASCII "VirtualAlloc" " t/ A& E5 h: Z4 y9 [$ h4 |
0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
/ ` \, a: @7 Z1 U: Y& n4 \: g0012BEFC 00B2D6C8 \pModule = "kernel32.dll"" u" e y9 a7 k! E
0012BF00 00B2E670 ASCII "VirtualFree" - t# d1 |) N) C) Y0 n* N& @3 Y9 v
9次F9提示一个非法指令错误,Shift+F9忽略。
# R r. |! o+ i3 ?4 i7 |堆栈内容 % f4 ^8 _9 M' W) }; U
0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B079958 y' r0 C0 G2 H& m) s! I
0012BC74 0012BDAC \pModule = "kernel32.dll"
' l$ Z5 X9 r3 ]& F6 U点调试菜单,里面清除硬件断点。
! ]' ?; `2 c( y# g. |5 `1 l6 g4 e% eCtrl+F9 返回。 2 s( l) C3 |! A# [. s
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
; H) A5 A3 q/ ` g/ z. N00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]1 x( l3 S9 m( P0 q! i
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
! K& y% l8 G' C! J" S00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]1 o) `% S! a' ?! l3 _7 @9 J% ]
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
6 Z0 v) w1 v- {: N8 b00B079AC 75 16 jnz short 00B079C4 C5 j+ p- `- I3 z! d/ t! V5 \! P, @2 Y
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]3 z6 W- D8 P( w7 b/ j) x; m
00B079B4 50 push eax
, ^9 U% o/ @3 R E+ _' v' l00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA+ k* z7 n9 G7 }) H( [
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
: d$ p. X) E% z3 n" t) {00B079C1 89040E mov dword ptr ds:[esi+ecx],eax- p) @" `. `2 z% I
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]* @# e2 y1 B1 w* Y2 c& G
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi+ u e% }' Y+ H; e$ r
00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 ) |. `3 c3 H1 I9 b
改为
2 ?' y3 J' x- ^. `/ s. n9 h00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
; @8 |. C9 e- R/ `$ j- J( R00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]! \7 B6 B) T4 P4 b
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
+ N: c$ U# d1 [3 ?. v; c: X9 g00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0] z5 ?' `9 ]5 e6 x: V1 ?3 X+ k
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
4 n8 U! |1 ]( b4 l8 @5 J. X00B079AC 75 16 jnz short 00B079C42 ]3 r- m2 u; i. X- O; e
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]* K; T& w& k# T. ?1 B
00B079B4 50 push eax7 b& p" b$ C: R7 S4 Z$ Q( c4 ^0 I
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA' g# P6 c e8 \, U# T N
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]9 ^" |" L# m" N% S
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax# F5 m7 @ @* r* q) ~
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]! t! L9 B. b9 U" `* J* _3 P7 a
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
. X" Z. W. e4 R* f1 ~+ C0 `) M+ H: t00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)
) t$ K9 F/ |( C& R+ u. q3 C2 N......................................................... 1 f5 k+ ?, w1 @ y" ~ }. A
清除所有断点。在401000段下内存断点,按F9 9 E# A9 O& n: s9 \: E9 i
00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里
# J5 ^+ I* F; a00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]
* I6 c: `+ t$ ?3 d00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952601 E1 r* o" [+ w% }% m$ N4 ~* j
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]% r- v0 D! A! w
00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
' A1 Z: E1 f( l, q" t00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]
- z5 z" }& I% N; l00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260, j9 U4 ?& s/ w! m0 k
00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]4 s( R1 c3 m/ J* P+ M! o- M/ w* }
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260, D) m& D+ l" q$ i
00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20] % C0 E- K& D+ _4 \# X& G
提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。
5 s) u9 c! Z6 b天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”
9 H+ B1 O. p8 q, m* a# b想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。
2 d6 _1 p2 m% E5 }" D% x期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^
+ T- ]! ^ k& b5 F5 ~* o' R后来还多亏wangli_com大大的指点。。。 , E% X) a) {' j3 D$ a$ [- Z5 A
先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行
# |, B. \( g; N1 M1 C77E7A6CF K> 55 push ebp //来到这里,F2清除断点% a6 M# A1 \% ~" M* t6 B; x8 N
77E7A6D0 8BEC mov ebp,esp
7 @& I: u2 X. `6 Z4 ~77E7A6D2 81EC 9C000000 sub esp,9C
2 ~1 |! `* h! R5 E: G0 k, v77E7A6D8 53 push ebx! A/ B3 X E( |1 w9 t- h
77E7A6D9 56 push esi/ o/ Z0 q3 y% k1 F$ x3 a9 O2 f
77E7A6DA 57 push edi |