数学建模社区-数学中国

标题: 菜鸟手动脱壳全过程,超详细~~~ [打印本页]

作者: 韩冰    时间: 2005-1-20 14:44
标题: 菜鸟手动脱壳全过程,超详细~~~

菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 & M" E4 \2 e9 M6 N( v0 I B【使用工具】 Ollydbg,Loadpe,Imprec1.6F

$ v. [+ L6 C9 M0 z2 o

【脱壳平台】 Win2K

$ l3 f2 T6 s" _0 j( N0 V

软件名称】 按键精灵3 V3.11

# R" m+ ^5 d- _% [/ [6 `. o

【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks

! Y0 {6 k" v: T) H/ b V, E

【保护方式】 Armadillo CopyMem-ll +Debug-Blocker

: N: _/ k. Q" ]

【脱壳人】飞舞的T恤/ d3 S0 j5 I1 v1 \ --------------------------------------------------------------------------------

s; V4 ^- G; m. o

【脱壳内容】

7 I8 G/ {; k2 O9 L+ Z7 E

小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。

. y& @( p. ^6 Z& r+ t

小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。

' R* F* d1 w( _% }

用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。

7 G" X) ]% k6 H7 i4 r

OD载入程序,插件自动隐藏OD,忽略所有异常。

5 X9 M% S4 q8 t& P' B

00485000 按> $Content$nbsp; 60 pushad //外壳入口+ l7 W; q/ a% x 00485001 . E8 00000000 call 按键精灵.00485006 0 {% y$ s9 ~. L7 x, W9 w00485006 $Content$nbsp; 5D pop ebp+ y) P. ]( g+ b 00485007 . 50 push eax , j, l) }. V: r+ g2 q00485008 . 51 push ecx " V2 L, p6 D1 d/ F/ @4 R00485009 . EB 0F jmp short 按键精灵.0048501A ' e l2 E; _( n/ S. d.....................................................................

- P5 ]! _- l6 U* [1 r+ P

命令行下断点 BP OpenMutexA,F9运行。

* [& l. Y* n ^: B

中断

& o1 M7 F1 R8 P, @

77E6C503 K> 55 push ebp" d/ T% [/ o! s" T 77E6C504 8BEC mov ebp,esp' E1 ]3 W* n/ g- J( [6 n8 E. S3 B 77E6C506 51 push ecx/ a7 |$ W% w8 {3 J2 k6 b 77E6C507 51 push ecx; ]/ I: H; P$ w, v% p; N 77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0 * `9 s# ^ `. R77E6C50C 56 push esi0 c( ?4 ]9 E+ E6 K' k7 ?# b( o 77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D% { ~) c/ [# L+ ~6 g: _7 _ .....................................................................

* x0 U4 F* {8 {0 C9 v% h; A% x

堆栈内容

* K. F( `1 V% t3 \/ x8 e4 Q

0012F574 0045C5F1 /CALL 到 OpenMutexA , Q6 N, c! e& K: [3 I* f: o+ Z0012F578 001F0001 |Access = 1F00012 u: W9 f4 \" U- s# S1 Z 0012F57C 00000000 |Inheritable = FALSE* j0 a6 T3 E- F 0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。

3 ^: I9 ?9 r# R) V$ O

找一块程序领空空地址,写入一些欺骗Arm的代码

! g( s/ A" J) z+ e7 V) _, f# h0 p

Ctrl+G 401000

' q) r- R f+ l* g+ n

00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。- Z3 F8 ~4 [. T& i3 y* W1 f 00401002 0000 ADD BYTE PTR DS:[EAX],AL ; ~$ T( u# b7 o& w# o1 L Y3 N5 D00401004 0000 ADD BYTE PTR DS:[EAX],AL1 C) I3 g R7 v9 C 00401006 0000 ADD BYTE PTR DS:[EAX],AL ) l* d5 P! f+ Q# S00401008 0000 ADD BYTE PTR DS:[EAX],AL& `* ~2 I ~! H! \ 0040100A 0000 ADD BYTE PTR DS:[EAX],AL 8 C( \- s) A: \/ }) E8 i; F0040100C 0000 ADD BYTE PTR DS:[EAX],AL5 x( a2 E3 c7 Y7 t8 ?+ _; F 0040100E 0000 ADD BYTE PTR DS:[EAX],AL

' J+ B1 O& X* S

OD直接双击修改,填入以下代码

, e4 T1 Z; q2 _' D, ~

00401000 60 pushad0 P! p3 k# [$ i3 R1 E2 z, G/ { 00401001 9C pushfd8 s* j9 ~, H9 R' s4 O 00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140" % L* E( n$ Z2 T6 Z00401007 33C0 xor eax,eax 9 X4 h6 d: N/ L: c1 B8 G2 B00401009 50 push eax" O; ]; ]- l8 L: y( B# j5 R A6 e$ D 0040100A 50 push eax , c; Q" ?7 V6 Q5 U* @' r: T) X1 v2 q0040100B E8 6D97A677 call KERNEL32.CreateMutexA! h% i+ F6 ?- W 00401010 9D popfd 1 W& B) y" D' @; \# w00401011 61 popad ' e( W: i1 r: {) J00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA " E! N( z/ ?5 ?7 i............................................................

7 E2 G/ P' ^* |, j# o, Z# w) }

将当前的 Eip 77E6C503 切换到 401000 来。

: W7 I+ n3 l v2 U; [# {9 O

点右键 选在此处新建 Eip ,看到Eip 变为 401000

1 f) [, J- ^2 U1 g7 z

F9运行。

& z+ D' |5 |3 P: l% [1 o" e u

中断

8 b1 x) [. R5 o. K3 c8 p

77E6C503 K> 55 push ebp //双击它或F2清除断点。0 h7 B6 C; {# g$ z$ ~$ Z 77E6C504 8BEC mov ebp,esp ^% j. n; S5 g77E6C506 51 push ecx 5 \/ I) o3 g/ Z8 u77E6C507 51 push ecx 7 f- v: j' w/ V( C0 z6 I# N1 E77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0 ) R/ ?# o- O6 S- `3 ?; ~0 f( Y77E6C50C 56 push esi/ ?. W7 K) ]; Q" n/ I% a1 p 77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D5 ?/ @" \2 C0 L ............................................................

* b: U# x6 G! e, F3 v( Y3 f& Q K

找 magic jmp 命令行下断点,bp GetModuleHandleA

6 g* B# t( H+ d! j8 r( n1 q" D. a+ d

77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。- u! d' F* e. `& F2 C' a l5 @2 c6 S 77E63DFD 8BEC mov ebp,esp V' |3 i8 o) L: J! `+ b5 _77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0 1 o5 v3 k$ z- \( w) n77E63E03 74 18 je short KERNEL32.77E63E1D 3 m. @: }3 J2 M2 L9 W# N2 a77E63E05 FF75 08 push dword ptr ss:[ebp+8]- A9 m4 D* V& x3 t0 O 77E63E08 E8 87FFFFFF call KERNEL32.77E63D94 $ i7 s- W2 L! ^' a77E63E0D 85C0 test eax,eax' O4 e* l0 Q9 j: E3 k 77E63E0F 74 08 je short KERNEL32.77E63E19$ s4 i, g& I3 h$ e/ G 77E63E11 FF70 04 push dword ptr ds:[eax+4] % p, z8 _1 n2 X ^. D& k# {77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW % r L" A4 F$ B3 l1 i, ^77E63E19 5D pop ebp # ~0 S+ R9 X% _( L# |( R( O4 w6 l77E63E1A C2 0400 retn 42 p, z/ W; v) v( E5 f ........................................................................

4 H, [/ }5 Q5 M1 E) W T7 Z

F9运行,多次硬件中断,注意堆栈值。

9 ] E, K) j1 d1 D# V

7次F9提示一个非法指令错误,Shift+F9忽略。3 c5 ^- D j. I; m- c3 k 0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801- v" i% ~4 s1 C6 H. M; N" \0 B 0012BEFC 00B2D6C8 \pModule = "kernel32.dll". w% Y' T: q! [, G 0012BF00 00B2E67C ASCII "VirtualAlloc"

; a' L% N" S9 O( T

0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E* x) |% g6 K) h5 Z4 v5 v' }1 U 0012BEFC 00B2D6C8 \pModule = "kernel32.dll" # P/ j/ n+ r3 \1 r% O3 B0012BF00 00B2E670 ASCII "VirtualFree"

; p5 f! f7 B8 g) {/ v {/ `* H

9次F9提示一个非法指令错误,Shift+F9忽略。

4 @/ G! n! u5 s! d

堆栈内容

1 s2 V% U: U8 h! A- C

0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995 6 H i, j. G& H0012BC74 0012BDAC \pModule = "kernel32.dll"

z. O; R, i6 G/ H

点调试菜单,里面清除硬件断点。

7 U3 c8 I# }' b* ]) W6 d* {/ a* h

Ctrl+F9 返回。

5 W1 j% \7 _1 |% j' [ z$ U! Z

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA& {. I9 O7 A9 X: q" S& } 00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]: A; k) N: i' x: W& {( f& K0 s8 H 00B079A1 89040E mov dword ptr ds:[esi+ecx],eax( t! A4 G$ g+ A/ ~& j% u 00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]) Y) |. m7 K1 P5 U# E4 \ 00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi + U4 h1 u9 l" X% n' D, ~2 F! G) c00B079AC 75 16 jnz short 00B079C4 + E, K% G1 ~" v6 \! }1 ?- |00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C] 7 N" T7 S* m1 O. n00B079B4 50 push eax , `2 y$ J# S; {/ K& ^00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA - Q- ^. y- ~" t4 k6 r00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 8 I' I* K' b0 z7 s" ?00B079C1 89040E mov dword ptr ds:[esi+ecx],eax2 x" E' C1 h: b1 ` 00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0] * f9 O/ v+ h' d0 ?2 B9 a4 b00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi o$ p9 O- U/ w9 u8 g 00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。

1 Y7 c8 h& m% ?" I2 v

改为

4 v- }! u( c2 F y; i( `9 R

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA / ]- F) {7 e: K8 t- ]' @* i" n00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]0 f2 x) [6 B/ E. j/ L% I 00B079A1 89040E mov dword ptr ds:[esi+ecx],eax & x" u4 [. _9 f" N00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0] 4 b( X1 U) P, \5 r% |00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi" u: f2 V$ \9 B ^' r. j3 ~3 O 00B079AC 75 16 jnz short 00B079C4- Q% |' x1 w/ W8 Y) x 00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]5 V3 r5 ]) Q5 j( [6 ~6 x 00B079B4 50 push eax & D N9 M/ G: O4 l9 ]9 W7 c+ s& Q/ n00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA $ o* { J5 Z+ |5 ^! y9 [+ _* G00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]! ~) i$ H/ G( A 00B079C1 89040E mov dword ptr ds:[esi+ecx],eax ! F: v+ z4 [3 Y2 _5 I6 y00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]) V( v m: ~4 I: ~5 U8 }/ C 00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi3 O( V0 Z( b8 v$ P/ k- ` 00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)

0 R1 P5 Z- W( J4 F. T9 h* Q

.........................................................

/ u$ E- A" s& u

清除所有断点。在401000段下内存断点,按F9

2 b1 k# [8 x# x

00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里 , b1 X6 I( @4 S0 s2 @. g) n6 ]00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54] ' h, D0 Q& U0 @00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 ) j. s' L6 G$ i6 I' L00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4] 9 ?5 J% K2 Z: {* s% ~00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260$ C/ h; I& t7 p2 ^+ y- l2 x3 a2 f 00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74] - o2 U* t; v/ ~+ U00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 / A! e7 W! A, P, r9 K) U( z00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]5 b# B4 {6 V) ^1 }# H8 ~4 D 00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952601 J7 C7 J* N! e7 N- O 00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]

0 I4 q" Y+ E v) N

提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。

5 a8 k) U; ?/ Q7 Y+ Z' [) `

天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”

" {. H" ~& y( o* E" {& c

想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。

, C+ H, q9 n' g1 j. d

期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^

5 A+ P1 Z5 v* t1 z! j

后来还多亏wangli_com大大的指点。。。

" K+ N* w. g5 Z6 P0 `& g; r* Y: N

先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行

' }5 X4 _. H+ }* e, U7 X; r6 _

77E7A6CF K> 55 push ebp //来到这里,F2清除断点$ O& `# t' `0 [: r 77E7A6D0 8BEC mov ebp,esp. I; D, c( w$ U 77E7A6D2 81EC 9C000000 sub esp,9C% w9 A* N/ A1 S; L- |0 |) H 77E7A6D8 53 push ebx : ? d. J. D) T$ F+ Q/ o77E7A6D9 56 push esi " K7 L0 U* n1 p, x( s* j77E7A6DA 57 push edi






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5