数学建模社区-数学中国

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

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

菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 . P( a( L7 D3 [1 J5 o$ f- Q【使用工具】 Ollydbg,Loadpe,Imprec1.6F

2 m8 K6 a. V' u4 K5 Q1 k

【脱壳平台】 Win2K

3 z5 o0 R3 h/ h2 c" Q( z0 O

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

4 D8 k( g$ z1 M# d

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

& K( K: I* p" | s3 k4 {; H, }

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

% |$ W; B# Q, D5 z, f4 s

【脱壳人】飞舞的T恤! n( |- b u8 X4 r- _ --------------------------------------------------------------------------------

+ I& @( p* _6 c) K: g

【脱壳内容】

4 w' U3 c: P: n6 }/ h

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

: b: b1 A( ~0 @, S; [) B

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

" K4 P7 G8 _9 `- s& r0 e

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

: n( f) _# r# j& D$ K( n3 I+ i

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

8 l4 v/ B# V0 M' e* n, H3 n5 u% f

00485000 按> $Content$nbsp; 60 pushad //外壳入口8 U$ \0 N7 w* c9 ?% E 00485001 . E8 00000000 call 按键精灵.004850068 A* L0 s3 ~5 Y1 ^% C! C# | q 00485006 $Content$nbsp; 5D pop ebp 4 b* {! t6 t5 [8 h) G, Q00485007 . 50 push eax8 v5 O; E& p; R1 @+ S 00485008 . 51 push ecx! P/ x. T- Y# n4 I5 G2 ~1 I 00485009 . EB 0F jmp short 按键精灵.0048501A ( ?- g& J/ a/ C! ?: o.....................................................................

. [- J# w. D/ n1 g

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

z& s- |5 }7 @/ ]; k

中断

9 j6 I6 [/ I; U# X

77E6C503 K> 55 push ebp- \9 H$ U) @3 B 77E6C504 8BEC mov ebp,esp ! l h5 V3 O' O9 J77E6C506 51 push ecx9 H+ @7 J" w% k$ ?- `) {: f 77E6C507 51 push ecx t4 h% Z* ]: ~7 X! _5 D 77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],01 B s- A& D7 H 77E6C50C 56 push esi, Y0 x( c$ p( o+ c. J4 p 77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D5 C0 K5 e' q7 J q- ? .....................................................................

- B/ ^3 P9 X( T# {8 O4 E R: Z

堆栈内容

1 e, J& O {5 G

0012F574 0045C5F1 /CALL 到 OpenMutexA1 |. |1 U% O! W Q8 g 0012F578 001F0001 |Access = 1F0001, {6 i3 A$ S1 @' R4 m, x 0012F57C 00000000 |Inheritable = FALSE: ~) [% U% \" `# O4 {# d: z4 R 0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。

d5 [. c- z) u* m c4 ?

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

4 z. r4 a/ l/ [- T

Ctrl+G 401000

/ s6 q$ s& ` k4 w7 I T9 J! Y$ A5 A

00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。/ g# s4 e. _# ~. \' ?: S 00401002 0000 ADD BYTE PTR DS:[EAX],AL . z8 B7 j; @2 y00401004 0000 ADD BYTE PTR DS:[EAX],AL3 k; G: w% w4 N+ [7 m) D 00401006 0000 ADD BYTE PTR DS:[EAX],AL: d @9 e9 e! ^9 i, n 00401008 0000 ADD BYTE PTR DS:[EAX],AL6 ~3 S+ B; o% u8 k5 o; `9 y6 T 0040100A 0000 ADD BYTE PTR DS:[EAX],AL 6 |: h5 C- a8 @- Z/ h8 V2 Q0040100C 0000 ADD BYTE PTR DS:[EAX],AL , n7 d' H3 y9 M0040100E 0000 ADD BYTE PTR DS:[EAX],AL

/ N) C3 c. W2 A7 H

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

- K$ A: T3 V" ^% }

00401000 60 pushad 7 {# K1 L5 k! m% D8 T( O, a00401001 9C pushfd & o# w5 |: n% j: E4 W00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140". q* P! c+ o! ?$ h 00401007 33C0 xor eax,eax5 H C2 p5 L0 O 00401009 50 push eax 7 C# ~% k- c. f0040100A 50 push eax " U8 b, z" l& l5 I7 z0040100B E8 6D97A677 call KERNEL32.CreateMutexA/ P& A; d0 J& y! p% J- u 00401010 9D popfd5 `$ c/ F4 u/ M5 p+ y- [ 00401011 61 popad ' }% ~1 z' x* J9 t+ ^00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA 0 @4 [2 m" O" E# m5 y............................................................

) m7 i9 h6 p i' [3 X

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

% w( t+ S& R) T$ B* |2 Z, f3 z8 K" q; U1 f

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

! B5 }) q' y- N% ^: a" |' W: o, R, V

F9运行。

# J: |3 P' [9 I5 k

中断

* H( G8 e2 C& e* s- I" a

77E6C503 K> 55 push ebp //双击它或F2清除断点。 8 R- H' ^; }6 F' }% y0 M6 d77E6C504 8BEC mov ebp,esp) D2 u' E* X5 ~+ E( y 77E6C506 51 push ecx / M4 T) b6 }. Y5 r, X: d77E6C507 51 push ecx ' V5 }6 a3 u! @5 w77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],09 B, X2 S% V7 a: e 77E6C50C 56 push esi ; o) d, R8 V. J. }% l; L/ M77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D % O1 G1 S: n4 X' |% W# T: V............................................................

+ V4 i& [* A6 A3 I) l! ^0 l- ]! m, s

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

9 `' g, F1 {, B9 a3 Q5 b+ ]0 ^6 q3 l9 i

77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。1 o1 q3 e/ e5 \ v" ~7 a- H 77E63DFD 8BEC mov ebp,esp 9 h6 ~% L5 I- z7 r2 E77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0 # P+ E* s$ ~4 U. R77E63E03 74 18 je short KERNEL32.77E63E1D 2 q4 @ A( C) g5 I0 [77E63E05 FF75 08 push dword ptr ss:[ebp+8], y y0 I4 ?' W" J 77E63E08 E8 87FFFFFF call KERNEL32.77E63D94 ) n+ p' I* b/ U8 W3 i0 R6 K77E63E0D 85C0 test eax,eax! K" v: L7 O- x6 k 77E63E0F 74 08 je short KERNEL32.77E63E19$ u, H p7 _ c/ {! |1 q7 n 77E63E11 FF70 04 push dword ptr ds:[eax+4]# l! m0 e* I0 a- ~ 77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW 3 P A1 R, u$ _4 F% t77E63E19 5D pop ebp ( [1 ?& w% r3 Q4 P" |77E63E1A C2 0400 retn 4 u% Q7 S/ ]7 V B" _) U9 s5 j2 v( r ........................................................................

8 u% r5 b, D9 V: ]) H& h

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

3 w+ q' O3 E5 C

7次F9提示一个非法指令错误,Shift+F9忽略。' r X2 c7 L9 A/ t% k m' P 0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801/ j/ i7 \) k9 n+ f4 |3 C/ D 0012BEFC 00B2D6C8 \pModule = "kernel32.dll" : R6 E# @8 n) ]* x9 ^0012BF00 00B2E67C ASCII "VirtualAlloc"

8 Y! y1 K: V2 R

0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E . N. Y H6 z. j0012BEFC 00B2D6C8 \pModule = "kernel32.dll"$ j/ q# g2 R: y 0012BF00 00B2E670 ASCII "VirtualFree"

. K9 T% ~/ T2 d) M1 q0 s

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

2 k! d% r L& T: ~) P% U+ l

堆栈内容

; ?' B! ], }% V# N; [ b* V

0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B079950 j$ a$ y9 o) a3 a 0012BC74 0012BDAC \pModule = "kernel32.dll"

% _9 _; Y4 ]! Q2 r+ C, @

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

- L! k9 I1 A5 d) o+ A* ? O6 l+ l9 g

Ctrl+F9 返回。

0 H2 `' \6 t" B6 ~

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA1 O# _" v, v% H A! h* G 00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 9 f5 L0 k% M& k+ |# p, e( `00B079A1 89040E mov dword ptr ds:[esi+ecx],eax / H, G! I0 J. `8 j0 \& A E, j- S00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0] 4 Z8 T: M- z m* h00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi: D5 H! z1 @0 A( e" R# Z% x% u 00B079AC 75 16 jnz short 00B079C4 ; k7 g+ u; y$ R7 f6 L8 ` n) P00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]! v' O& |/ o1 N/ |- r0 r/ b 00B079B4 50 push eax. E: k6 r& t8 P- }# o 00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA8 d& N- e; n* J4 j+ P9 ` 00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] p' A; j t2 B00B079C1 89040E mov dword ptr ds:[esi+ecx],eax! l7 ?# k: N+ p( a 00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]9 F! c* i" v0 M: }2 W 00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi 0 l& W" H! o p7 ~00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。

/ C- ^/ `6 Q0 e6 p4 k( A0 v

改为

v P3 }4 p' T2 W9 t8 b

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA, U- T& F2 m% i6 W& L k& D 00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 1 K; \% d5 y G; W( `8 ]2 W00B079A1 89040E mov dword ptr ds:[esi+ecx],eax. `9 K4 u% U7 d1 `2 p. v% X 00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]" `6 q7 |3 W6 z" [& a0 l3 Y1 t 00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi % }0 E/ ]8 y1 ?* i5 |- j00B079AC 75 16 jnz short 00B079C4 * |( ]1 ^) w- W1 l8 j00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]- D! |; j7 `4 G8 w4 G3 ]8 I 00B079B4 50 push eax9 u& C2 x! _7 T 00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA " v$ Q7 y5 p+ g4 v" J00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] ! u! f5 P) p" o00B079C1 89040E mov dword ptr ds:[esi+ecx],eax 8 c* g) S2 O9 ?4 o& K v% n00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]$ }2 a9 E# J2 Q9 ^% T% I 00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi 3 e- h' ?+ @$ F+ S$ h00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)

* m6 ~3 l% M8 n) X( m3 H& a1 Q$ p6 o4 U3 I

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

1 e4 A o' m) N

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

" Y1 l8 f8 y7 T8 K; n* J

00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里 4 V5 y. L3 f+ A M/ z j: }00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]) R' R' n" B3 R- y; G+ r( p 00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952608 D3 ^& q0 R9 Y6 X2 d 00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]$ N6 X: `5 K0 N! J% x2 q 00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260! M3 Q) j# ~) W* r 00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]6 h- N6 O2 M# o' v 00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 - j, G, I. J: m C' c4 W00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30] 6 h }! M/ k0 F0 j" E00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 ; `) c. s8 |5 f" r9 H8 E, o a00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]

) k4 L9 R+ @; l8 Z0 E0 B- x

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

" ]* G- S( ^* `/ `8 B

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

8 y- @1 }2 }) t3 ~9 W% [6 h

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

5 e5 Z- q m' N7 @9 M

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

& I- ~7 R( E/ W

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

% G8 v* @: X( O

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

/ H2 f7 M( L7 f7 g: K; ^% N0 }, S

77E7A6CF K> 55 push ebp //来到这里,F2清除断点' b4 s; v3 x# v) F4 J 77E7A6D0 8BEC mov ebp,esp- u ?2 f7 q5 j( \. M) D 77E7A6D2 81EC 9C000000 sub esp,9C" W5 B4 m( ]5 q& U 77E7A6D8 53 push ebx H4 S+ k& b! h$ C3 c ?) { 77E7A6D9 56 push esi 8 }4 l# r1 Y, z0 } {' O77E7A6DA 57 push edi






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