数学建模社区-数学中国

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

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

菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 : W3 M) o8 d( _( y) a9 v2 X) D' h【使用工具】 Ollydbg,Loadpe,Imprec1.6F

|" E2 c, T* G/ w+ H" O! Y, `

【脱壳平台】 Win2K

1 Z% @1 c1 h' @2 n+ F6 W2 p

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

* l0 `* y$ O0 M9 y* r- M9 Z* |

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

% k+ w' G$ z/ W' F

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

: d2 {6 a0 L* {0 T/ g5 A

【脱壳人】飞舞的T恤. Z9 d$ P) O% N1 y' u9 E4 I& K' c5 n --------------------------------------------------------------------------------

3 u: B! e& f" b. t, k

【脱壳内容】

) n/ ?, S+ K4 M- K: b$ M/ ~ l* x

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

4 {: b" j( H- b5 e a7 Q8 Y

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

. h. p+ I z3 A8 g6 [6 l* K

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

" g& a7 e2 T% j, P. P; p

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

! U2 f$ I7 m" C" {' G

00485000 按> $Content$nbsp; 60 pushad //外壳入口 1 w: ]* Q7 u& X: Z8 y: Y, r00485001 . E8 00000000 call 按键精灵.004850062 z" c Q& B3 T- M$ _ 00485006 $Content$nbsp; 5D pop ebp ( W. e/ S K/ I# E& L6 p00485007 . 50 push eax8 E' i8 b8 P5 P& j1 ^+ Q 00485008 . 51 push ecx6 d; z. [/ [ R5 A# j$ u O 00485009 . EB 0F jmp short 按键精灵.0048501A 6 `5 T* g3 y# o A: Q.....................................................................

# w2 ^/ x' d9 c; N d

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

6 e4 B C* I& u/ b

中断

/ j- v4 `/ ]8 T

77E6C503 K> 55 push ebp( }) w" g& ?# |5 O2 {9 E 77E6C504 8BEC mov ebp,esp ( z. r; m% Q/ h77E6C506 51 push ecx 3 j& E+ J4 c; t" z77E6C507 51 push ecx1 K: Z# Z( M) J/ M( L 77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0" L% N+ Z4 N$ k1 q5 k* C9 s 77E6C50C 56 push esi . r- B; m8 I. x3 R77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D ! L! r0 Y5 h' [) Y6 x.....................................................................

# T7 `8 e" S3 H B2 Z2 x

堆栈内容

9 X) M/ V9 {5 E

0012F574 0045C5F1 /CALL 到 OpenMutexA; X! D# n5 ^) g. u9 S, l& P- | 0012F578 001F0001 |Access = 1F0001 ! [( Y: b! f' d) u. `/ g& f0012F57C 00000000 |Inheritable = FALSE# B! f3 U' {7 J$ b4 l2 M- Q 0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。

- v# }2 A0 q# y. t8 W! N4 V

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

+ p- y+ H- g9 n' O

Ctrl+G 401000

: S6 l4 E$ p; m# f8 @6 X

00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。 % @) d2 D* e0 }: d+ g$ o00401002 0000 ADD BYTE PTR DS:[EAX],AL% T& }/ B1 M0 v/ m 00401004 0000 ADD BYTE PTR DS:[EAX],AL ; n3 t/ Q1 H! j+ X3 t00401006 0000 ADD BYTE PTR DS:[EAX],AL$ L% O0 Q9 _* x# H 00401008 0000 ADD BYTE PTR DS:[EAX],AL 4 M) Y& G: T N' _0040100A 0000 ADD BYTE PTR DS:[EAX],AL & {$ J' q7 U6 Q) R: s0040100C 0000 ADD BYTE PTR DS:[EAX],AL M# w+ G: o: q5 L: Y+ C0040100E 0000 ADD BYTE PTR DS:[EAX],AL

5 l9 d* B& g% X# N

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

7 `+ o+ m8 Q, Y; T! R) A- V

00401000 60 pushad( r0 }. U5 W. L" T6 R! d6 ]2 O 00401001 9C pushfd $ D% k* @" h+ I* \+ }5 q+ O00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"5 u- N: P) u) ?8 v 00401007 33C0 xor eax,eax; i. c6 v* w; c1 ]+ q l6 a 00401009 50 push eax3 \7 x) G6 d1 i+ P# b 0040100A 50 push eax- g2 Z+ A R$ \9 X& i$ R+ A 0040100B E8 6D97A677 call KERNEL32.CreateMutexA# Z- q; f3 o3 ^2 u1 S; p 00401010 9D popfd" p* u( f# T. d1 R! q 00401011 61 popad * M. }3 m2 X7 p00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA; N! H/ k1 c c8 }/ Z8 _ ............................................................

$ X; X% |/ V7 k# | B' W! o

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

( K1 S7 h0 C, t2 N6 R1 h6 [

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

' _- T+ a' ]+ Y) Q

F9运行。

) [7 L2 u: O4 `

中断

7 n$ n+ y7 s, i2 n" e' l8 v

77E6C503 K> 55 push ebp //双击它或F2清除断点。 - W& Z1 B5 X3 r& [7 j77E6C504 8BEC mov ebp,esp 0 o+ X% S( m3 b( n' l77E6C506 51 push ecx1 O" q5 X( h! s; u/ I 77E6C507 51 push ecx' `: Y! h5 O! X" g 77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0" Q7 u6 M4 h5 a% D9 l) J6 V4 Z: u 77E6C50C 56 push esi 1 m' O% y& `* r2 i77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D & d$ Z' d0 X5 x' E/ u! r3 p............................................................

& ]0 q L0 m3 Q7 H+ O/ Q

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

" m" m9 e ]7 e

77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。* | z( _$ E# ?/ J1 Q9 T, H7 i 77E63DFD 8BEC mov ebp,esp : E" V( M( M7 X% C! P9 A0 [- E77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0 Z( F6 ?2 r2 L1 V+ w7 g77E63E03 74 18 je short KERNEL32.77E63E1D * [4 w e I/ t' p: g77E63E05 FF75 08 push dword ptr ss:[ebp+8]6 Z3 ~9 Z) e+ k& C. R9 |7 F 77E63E08 E8 87FFFFFF call KERNEL32.77E63D947 d& e, L( S S 77E63E0D 85C0 test eax,eax- W0 H5 E) b! U; p. x* v3 V 77E63E0F 74 08 je short KERNEL32.77E63E19 ) e' M& s- A9 J5 v! Y9 M p77E63E11 FF70 04 push dword ptr ds:[eax+4] 3 j9 G& |; `& I- N3 K# i77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW * O6 A) f7 H4 L1 P" I s% F77E63E19 5D pop ebp, h0 p \0 g. d. g. I" W7 P 77E63E1A C2 0400 retn 4 7 A; e: X* h6 X9 H: M% C" {7 a........................................................................

* }3 r5 P0 q( _' p) C# I

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

7 R. ^+ s. D* \ S. X3 ` v5 A/ g

7次F9提示一个非法指令错误,Shift+F9忽略。 - r9 I2 n# O2 |$ @ d0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801 ( N4 v! G+ d: H! ]& N0012BEFC 00B2D6C8 \pModule = "kernel32.dll" . _9 H9 y6 h. `2 Q$ o7 I0012BF00 00B2E67C ASCII "VirtualAlloc"

# i5 R& Q6 c) V

0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E - c0 C) \- B4 N- e0012BEFC 00B2D6C8 \pModule = "kernel32.dll" 8 Y# V' M7 F: L8 s' X3 k* N0012BF00 00B2E670 ASCII "VirtualFree"

) a# `0 Z! S4 ]$ i/ R b r+ G

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

# T; E! `" ]0 b4 F3 h. k5 ^

堆栈内容

; { l( A/ N g! ^* u

0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995 5 Z- c$ G2 b( a% x; f0012BC74 0012BDAC \pModule = "kernel32.dll"

4 A" d. o/ R# u4 D. J

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

. J( u& L. \# ?% g" i& n

Ctrl+F9 返回。

2 J3 U5 c, @8 h! u! h, F9 D4 F

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA: f- Q3 s# S/ ]) w, ]) { 00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]/ X! ]; s) R2 O 00B079A1 89040E mov dword ptr ds:[esi+ecx],eax# g( m0 [9 r7 Z 00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0] $ o' x0 w& V0 A2 | e00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi % W0 D# K2 N3 o0 |, q00B079AC 75 16 jnz short 00B079C4! e" {6 r/ e( j 00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C] * {. j, w7 U; p I$ n5 G- P4 c; w( K! C00B079B4 50 push eax- T9 A; _' U# o" L+ J 00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA- t# J( |- n# L 00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 8 R0 y1 [4 M1 r! I00B079C1 89040E mov dword ptr ds:[esi+ecx],eax : r7 w3 ]7 e" M! d3 {00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0] 7 {: x# _& I& o# Y: l3 d00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi8 Y( Y7 i' v* g: K/ b9 S9 L9 h 00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。

% t! S P' K( _

改为

. V; L3 n$ ^8 h

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA % [. o/ t* F$ w4 @( T& a% t00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] ! C* ^- r" r! ~6 T1 A$ F+ O00B079A1 89040E mov dword ptr ds:[esi+ecx],eax+ V3 U9 {, G, t d6 ~2 g 00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]. R, L* J9 o3 {# g 00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi" q* r" j1 G, N" ` 00B079AC 75 16 jnz short 00B079C4 ! I& {9 a: v. [* U7 F00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C] $ a9 I! z1 g- D6 q; l2 U5 V00B079B4 50 push eax5 s* |# r R0 u1 H 00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA# T7 K) o4 m" N4 F; n" D 00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 0 @8 I5 d" C0 e- h00B079C1 89040E mov dword ptr ds:[esi+ecx],eax % y3 I6 l7 N0 J7 Q- P( v; N, Z00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0] Y/ H4 W- ~, ?2 X 00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi% D* S9 M1 U8 d- E+ |8 q& q* z0 h2 s 00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)

, o$ Q3 `) F+ F0 r- h

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

: u% D3 G$ l; }

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

+ T' ?% X# r" t

00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里" Y7 p8 N& H3 V' ^7 E. u 00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54] / x# `. W" V: W2 x00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 3 L, l7 I @ A9 b* }: {0 {00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4] 4 B' f8 O8 _# e/ x& B$ L# G) d00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952609 p6 ]8 {! z s1 i+ e 00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74] / k, Y+ O; P* P: c) O00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 - ~0 g7 O+ a- `5 L" P: O: {; k$ b/ d00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30] 6 ~: `; N; I- T0 {/ c4 @- Y$ e00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260$ W) J6 b( t/ Y: U# G 00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]

+ X+ _/ |" l$ B: u" I: G- i

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

& E8 }5 B* ?7 m# i: H2 J

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

5 O! q# S8 E- [ D

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

5 L: ^6 R3 M8 w3 t/ X0 o

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

2 U1 }+ l4 {% M5 ~9 |( B; j- r# q

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

, J& a) i7 ~! E

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

0 K" P3 m- a9 F/ n! } K0 L

77E7A6CF K> 55 push ebp //来到这里,F2清除断点" O7 U# e4 i1 W6 z& W 77E7A6D0 8BEC mov ebp,esp + A0 H' K9 a! f& v/ O77E7A6D2 81EC 9C000000 sub esp,9C & \4 g% k4 _& D77E7A6D8 53 push ebx$ K& o! D5 w9 b a9 z 77E7A6D9 56 push esi ) _% |! y- @: ^/ O b& h6 ~77E7A6DA 57 push edi






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