|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 + G6 {8 Y" Z. u; V' a# I: Q
【使用工具】 Ollydbg,Loadpe,Imprec1.6F
: e7 n$ l* }& e5 n【脱壳平台】 Win2K
$ Q: h9 a% q- S8 }* M# a; U【软件名称】 按键精灵3 V3.11
3 o I2 }8 v0 c# f2 g9 y【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks 2 f( S. g3 @- G' l5 T7 P
【保护方式】 Armadillo CopyMem-ll +Debug-Blocker T* f1 v( z6 G" Q- R
【脱壳人】飞舞的T恤
$ s& D" k) r: `--------------------------------------------------------------------------------
2 T0 ^% e& B( ]1 o/ E' f【脱壳内容】 # o; q8 x; z& S2 R1 n
小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。
/ L/ Q) W+ X# e% A. v) d+ ]小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 * M% i; s4 N) D4 N( Z" x
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
" O+ i$ k0 J% U; XOD载入程序,插件自动隐藏OD,忽略所有异常。
$ }0 i: z2 ^: Z, L/ f' `1 ~00485000 按> $Content$nbsp; 60 pushad //外壳入口
$ W( `" q/ ]' a8 n8 c* I' n00485001 . E8 00000000 call 按键精灵.00485006
2 H, u& s' u$ k! ]00485006 $Content$nbsp; 5D pop ebp/ Y& Z' y! Y! `
00485007 . 50 push eax
( x$ X- P) A% E+ u00485008 . 51 push ecx" y$ n; ~3 \+ s1 a0 [7 m7 y( F- \
00485009 . EB 0F jmp short 按键精灵.0048501A
* `4 [. m0 W8 T8 l7 D.....................................................................
' A: V% |. B: |2 K1 O命令行下断点 BP OpenMutexA,F9运行。 2 @* s& z- Z8 _* r
中断 8 ~ v6 S M% [* X w
77E6C503 K> 55 push ebp. ^: g/ I% D& z' w, p6 D
77E6C504 8BEC mov ebp,esp
; C6 E) N) D i& E1 m- u9 F77E6C506 51 push ecx
8 {- I- Y4 y# y5 Q77E6C507 51 push ecx+ ?$ V/ n U6 Y7 d4 _3 q; @6 e o( ^
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],00 O. y7 H- }: R$ ?2 u
77E6C50C 56 push esi
3 B% }# Z; Q j8 W" e$ j: Z V77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
0 @& h( v' g p0 c! i$ a, B.....................................................................
9 B7 m; ~0 J! x( v: W8 b) b堆栈内容 - C. Y/ K, E4 Y) t. d' w
0012F574 0045C5F1 /CALL 到 OpenMutexA1 `0 u5 y# n$ ]! f# b
0012F578 001F0001 |Access = 1F0001
1 D# ^# I) f8 w0012F57C 00000000 |Inheritable = FALSE
6 {4 ]! R9 ]* R6 b7 k" J5 `' f+ [; ^0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。 0 k7 z! z8 v5 a3 r! K2 a& T! B I
找一块程序领空空地址,写入一些欺骗Arm的代码。 - s* g2 X" Z& W! L* u% }
Ctrl+G 401000 , E% S6 ^: ?( p, `, u
00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。( y7 ]$ F$ n5 h0 f: v
00401002 0000 ADD BYTE PTR DS:[EAX],AL
" a4 t* ? @/ K4 K3 x/ @" Y& k% L" _00401004 0000 ADD BYTE PTR DS:[EAX],AL
& W/ |' x0 g2 H4 V# {00401006 0000 ADD BYTE PTR DS:[EAX],AL8 D4 L8 I1 r. N2 }
00401008 0000 ADD BYTE PTR DS:[EAX],AL$ O) Z% T+ K7 U+ q1 f: @
0040100A 0000 ADD BYTE PTR DS:[EAX],AL7 l% Q+ ?' g% }2 C! M( E+ w Z
0040100C 0000 ADD BYTE PTR DS:[EAX],AL. z+ h( K. ~3 @# I) L, T$ w) b
0040100E 0000 ADD BYTE PTR DS:[EAX],AL
, f" o' ?0 K- S% [2 Z3 j! AOD直接双击修改,填入以下代码。
4 t2 m2 B7 F2 e00401000 60 pushad
- K0 z6 p! s/ \. ~; K5 a* y( O0 N L00401001 9C pushfd
/ c* h8 x" F2 F7 X7 i7 @: w00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"
3 d1 @7 Z W, o. ~4 S; J) e00401007 33C0 xor eax,eax
x4 x: _5 s' w% {) _8 C! ~00401009 50 push eax& _/ e; X% p$ K8 ~: A. L) `. Z
0040100A 50 push eax
3 S; h$ M7 U6 N6 a2 ^6 n0040100B E8 6D97A677 call KERNEL32.CreateMutexA* y. S4 f, a4 i
00401010 9D popfd2 k% _( d. K% g3 v% I7 e
00401011 61 popad
$ d8 L0 s/ K6 N) v1 v) f00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA
2 ^ U' h$ J* O............................................................ * d& K2 k, y3 i6 o1 ~" s
将当前的 Eip 77E6C503 切换到 401000 来。 y h. n/ n4 ?, t) M9 T
点右键 选在此处新建 Eip ,看到Eip 变为 401000 $ l6 ?% _6 u/ K$ b9 Z6 z
F9运行。
" r) e+ R% _- [中断 . v+ ^ B3 [' ~6 y, \1 _
77E6C503 K> 55 push ebp //双击它或F2清除断点。
O( D; {. e, }# h" F4 [: e1 y* e77E6C504 8BEC mov ebp,esp
( a: n) [1 l! f- v& b% C0 G _77E6C506 51 push ecx/ v6 k) Y. s# O1 Y9 K& W
77E6C507 51 push ecx9 [3 `7 f q* J+ g* z+ z
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],05 ` b' e0 K, f6 g2 O) x
77E6C50C 56 push esi
7 ~1 ]2 Y1 y. x6 r, V$ [77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
* k# F2 D0 h# o............................................................
: @" c% E- Z4 s找 magic jmp 命令行下断点,bp GetModuleHandleA . p, t$ O2 u4 O
77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。
- F. _ G% g. S) I77E63DFD 8BEC mov ebp,esp- o; I8 J/ d! o8 h* r, z9 r
77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0; }: X8 t7 {& O9 u8 u& O
77E63E03 74 18 je short KERNEL32.77E63E1D- \2 L t A: z& x& ?% v' N* T
77E63E05 FF75 08 push dword ptr ss:[ebp+8]
( f9 S" G6 q( k" u! ^77E63E08 E8 87FFFFFF call KERNEL32.77E63D94) B1 s+ y5 l! {
77E63E0D 85C0 test eax,eax* x; T# I" w3 d8 P% ~+ r
77E63E0F 74 08 je short KERNEL32.77E63E19
9 Z- v. ~+ V/ {; k3 L0 l/ b77E63E11 FF70 04 push dword ptr ds:[eax+4]
, F# o0 J$ ?$ c6 l/ `. Z% M77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW2 ]$ W5 ]" ?8 J$ _
77E63E19 5D pop ebp
! X" M6 h. O1 W& V7 E( Q* E77E63E1A C2 0400 retn 4
1 \: i/ k8 a$ N........................................................................ 8 I0 |, k$ Q/ f) D' s2 ?* ^; U- {" x
F9运行,多次硬件中断,注意堆栈值。 5 L9 w" g7 C6 B# `$ q( A; |
7次F9提示一个非法指令错误,Shift+F9忽略。* r0 C; y: s' F- E, X4 s% D- V; n* y
0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801# J9 j3 A4 m p; K4 o: C7 Z& `
0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
; w% M2 D6 E9 N: w& s0012BF00 00B2E67C ASCII "VirtualAlloc"
, ]& {' \9 e, _7 K" I, J: e0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
1 T( [7 m# Q0 U! D8 i* b: p7 s0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
& B! T. {; s4 G j* r5 r3 P ~0012BF00 00B2E670 ASCII "VirtualFree"
g. z) ^+ }. n% j9次F9提示一个非法指令错误,Shift+F9忽略。 1 G$ g/ P) @5 v" r' k
堆栈内容 % B( s3 i1 ~3 w/ I" n
0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995
: G1 M5 T7 I# X( c9 m- p0012BC74 0012BDAC \pModule = "kernel32.dll" 4 H( K% E7 w- A, j# |( t
点调试菜单,里面清除硬件断点。 , f' n2 \, f: e6 s9 l
Ctrl+F9 返回。 . V' t8 I9 N& m
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
- X2 r1 o* f* k% A( g00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]6 J6 I, e6 ~8 v! J3 [% j
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
. L/ h: T+ b ?% o00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
, A" p0 y, ~* o4 `& d! H/ w7 A& n00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
8 e: C X: |2 W. ]5 S00B079AC 75 16 jnz short 00B079C47 T/ n9 Y& \3 u
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]& E. l# s+ @. w# b
00B079B4 50 push eax9 i' B( ?- K" h6 T+ ]
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA
/ i! P5 q* {& B8 r00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]7 m* w9 ~" a( } ]
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
+ V4 U1 C0 A2 Q8 N$ g+ ?2 G00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]) L$ T4 Y- _" V( S3 P& F
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
4 N' M1 D; e, c1 _! t00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 l" q" l1 x4 V
改为
) Y8 W3 o6 V# V2 q! `00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
6 \- Z% `2 T7 ~( S; r00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
! {4 z* K" Z1 G& _* J/ _00B079A1 89040E mov dword ptr ds:[esi+ecx],eax$ I# O" e8 u/ e7 _* M
00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
2 V, |7 s% ~9 ^, k3 G' I% r! g I7 D00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi
) e0 T5 f2 x- x) D00B079AC 75 16 jnz short 00B079C4
; a! \5 T; p- C5 a+ u7 W00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
4 E$ a; J: U: e7 r& X- M4 P00B079B4 50 push eax
1 ?/ q) l: A0 G3 @, `00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA1 p0 j7 a1 G- @$ J% O# R% H
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]2 |7 g: C- I% J
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax, z+ ^7 p/ ?! S; |
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
) N7 G a/ `2 w0 k/ P$ V i00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi. {% v2 j7 T+ }) G
00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)
) J" [9 N3 q; H$ P/ X( i.........................................................
" u+ q! ?- M5 b6 U清除所有断点。在401000段下内存断点,按F9
0 p) j7 M* O6 x00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里
! u! N. F8 m4 w8 J! j00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]
+ g+ A5 e/ O% J6 }1 e- Y9 J00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260: i9 p( X' D3 O; D( q
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]
/ Y0 X# }3 i* |00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952609 j8 k* a7 V& @
00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]( d8 i4 @1 O/ h& x
00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260# j& r, e* E/ G
00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]4 E( U* a( f0 B0 X# I5 J0 y
00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
. n! U1 m. O: g00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]
: o) ~# | \, z提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。 - _9 d$ W! W- G/ g. C* d: [
天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置” ( ^% B/ X4 R# S3 p) W$ w( x1 g
想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。 $ J8 e: p% }# u, a: ?) s$ k! a
期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^ , g8 l& |6 m9 d+ W
后来还多亏wangli_com大大的指点。。。 . R, g$ ^: Q3 x2 z1 q
先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行 ! v( c$ V+ N) ?3 ]0 O: I9 {
77E7A6CF K> 55 push ebp //来到这里,F2清除断点9 D; Y' P6 Y' \, K
77E7A6D0 8BEC mov ebp,esp
4 ?4 K9 u, x" P6 @% Z2 F2 ]+ ]77E7A6D2 81EC 9C000000 sub esp,9C
0 K# G# H. k P7 h2 w+ U77E7A6D8 53 push ebx( U, n% ]6 O. i# W( |: z; k
77E7A6D9 56 push esi
- ?! z' F! L6 l) ?/ O5 {; w3 \77E7A6DA 57 push edi |