数学建模社区-数学中国

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

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

菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 ( A/ y7 Z' F1 u【使用工具】 Ollydbg,Loadpe,Imprec1.6F

+ Q3 b) m- A, r# Q

【脱壳平台】 Win2K

6 J6 @& [' u: U) U

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

& Z! m, W; j; J* {- K( {0 P3 g# D1 C/ J

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

) L& p/ R) ^+ B5 `# r& y0 M+ ?

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

4 D. z0 S8 y6 m- u

【脱壳人】飞舞的T恤0 h5 {; N1 X6 N7 I& w --------------------------------------------------------------------------------

: F+ Z( `: [$ G1 u; [4 v- a

【脱壳内容】

" S F# M* U* ]4 s1 `

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

3 P) e( p; E+ Y4 m. F1 d8 w, x! i

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

" [3 t. y& w: ]4 ^9 E7 n

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

4 A0 R% g! L8 _: h( Q. ]' j

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

$ s v8 U( }3 m3 x

00485000 按> $Content$nbsp; 60 pushad //外壳入口 8 S! l8 K1 _/ f2 e3 T/ E" O9 I: d00485001 . E8 00000000 call 按键精灵.00485006 2 C( [ q2 p; M6 Z0 ~00485006 $Content$nbsp; 5D pop ebp 0 Z% s2 l1 |2 S8 w# }0 [% z! y00485007 . 50 push eax # H% |" `. e( V+ m9 u) x+ ]00485008 . 51 push ecx 8 Q- H+ }* j6 H+ @$ C0 r1 ?3 Q00485009 . EB 0F jmp short 按键精灵.0048501A * l& |. W8 b8 u b.....................................................................

0 K- _* {, l" @

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

, N9 A/ N- a2 C [7 g" o

中断

& ]% {' i: e; R- u4 e; t# U/ L$ ^: u+ H

77E6C503 K> 55 push ebp+ g' N3 P, Y: e1 i 77E6C504 8BEC mov ebp,esp & C, X* ]' J9 @$ O77E6C506 51 push ecx 3 a' ^: s& ~( k! L. p77E6C507 51 push ecx " G; I$ L2 d3 H6 j77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0 0 b9 h$ I8 b1 G+ U! S# _77E6C50C 56 push esi 8 z* C/ J# w1 b4 ] }77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D 2 e8 G7 c' \1 o) E* L; ]5 s; q- `2 l.....................................................................

) M1 {! y9 t: @3 y @

堆栈内容

6 G( a& ?1 D. A# m% B* R, U ~6 O' ^

0012F574 0045C5F1 /CALL 到 OpenMutexA 1 o2 [4 l J& k0012F578 001F0001 |Access = 1F0001 1 L- E6 d) Y% Y, W7 y0012F57C 00000000 |Inheritable = FALSE ' g, J& |0 @ J2 B" I6 ~: P6 F0 `0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。

1 B }7 U& i! k

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

8 o$ ?6 _$ Q; j6 \! S5 Y3 T$ c

Ctrl+G 401000

0 [2 m1 K2 E C5 J/ U

00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。 . ^$ n; P7 j) P7 X9 q* h00401002 0000 ADD BYTE PTR DS:[EAX],AL - _- T: \) {4 G. r" K00401004 0000 ADD BYTE PTR DS:[EAX],AL 7 w2 H r# h4 ~) @. @: O' [00401006 0000 ADD BYTE PTR DS:[EAX],AL2 {& _' [) y& W7 L' Y6 } 00401008 0000 ADD BYTE PTR DS:[EAX],AL5 v% f$ V% T! }# |- W1 Z6 h) Q 0040100A 0000 ADD BYTE PTR DS:[EAX],AL2 ^6 A, g* I# G( d2 { 0040100C 0000 ADD BYTE PTR DS:[EAX],AL* a7 s4 A+ T+ Y7 E* a 0040100E 0000 ADD BYTE PTR DS:[EAX],AL

5 {" ^$ \, w& y' S/ u+ |7 L

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

$ t3 Z k+ l. M6 \) @9 M

00401000 60 pushad! b0 q9 z) i }) A 00401001 9C pushfd : o% i9 m7 N+ ~$ ~00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140" 4 M" h% O$ f% a6 H2 ?. o4 Y8 v9 A00401007 33C0 xor eax,eax2 q ^* n" B3 ~* n9 s 00401009 50 push eax ; s% O. B1 u" y% Q" [# _0040100A 50 push eax 5 X! w0 U3 I$ A, F% U# S0040100B E8 6D97A677 call KERNEL32.CreateMutexA: v3 Q6 v0 P ]8 J! n2 b5 N 00401010 9D popfd " z- k, p& n2 E/ E00401011 61 popad G& o8 w$ q8 ~2 |00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA ! ^1 s! ^) }- T............................................................

" |& z) e2 P# O6 s' O

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

. j0 F7 \- [' S' s. c6 | A

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

& G# V# r7 {: C

F9运行。

$ T5 N$ }8 P9 |$ x

中断

' [7 [% W* b. f& [( A2 i6 h7 ]

77E6C503 K> 55 push ebp //双击它或F2清除断点。 " Z8 e) z* [5 |( A: h77E6C504 8BEC mov ebp,esp' r0 x q0 ~. F" U0 H& N% E, g n2 u. \ 77E6C506 51 push ecx : \' k! }0 i1 D" g77E6C507 51 push ecx * S6 Y9 E' i, S1 j1 h77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0 ' S% ~( X& g' \, x77E6C50C 56 push esi 2 a/ E! o. _, H4 l! L( g ~77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D0 Z4 q8 F1 e( A# Y, m6 K+ s6 F ............................................................

" ]5 n6 O2 I$ T% b0 B

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

2 `: u2 m/ |1 `. _5 w: j

77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。 ( Y1 \+ W Q# ^( [1 k$ d! O77E63DFD 8BEC mov ebp,esp 5 A. z2 P; k0 D- C. |2 [- H7 ~' l77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0 . j% ?9 p; E+ H# ^4 ]77E63E03 74 18 je short KERNEL32.77E63E1D4 m+ n' _% U. c5 L+ n 77E63E05 FF75 08 push dword ptr ss:[ebp+8]0 [* `* G* j# Q5 M5 o# X8 l 77E63E08 E8 87FFFFFF call KERNEL32.77E63D943 P$ a$ S6 F* R9 Y1 F h( C 77E63E0D 85C0 test eax,eax ( v5 l) N/ w! }+ A9 `8 D77E63E0F 74 08 je short KERNEL32.77E63E19 5 d2 l7 Y; Q8 c5 g6 m77E63E11 FF70 04 push dword ptr ds:[eax+4] : V9 Y* h9 Y: |" i3 w77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW , Q$ \, T2 B$ _+ R H3 Z77E63E19 5D pop ebp / w! B1 r! |; g4 N77E63E1A C2 0400 retn 4. b6 k9 F: V0 l2 H ........................................................................

$ U" h! z2 d; |' T

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

% R" U% f5 x G2 D/ b

7次F9提示一个非法指令错误,Shift+F9忽略。# Q' y4 k; D. ~. i 0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801 4 S' f$ T: J2 ]$ N3 P0012BEFC 00B2D6C8 \pModule = "kernel32.dll"% b2 ?: M4 e2 d 0012BF00 00B2E67C ASCII "VirtualAlloc"

, X* O; U& E+ J

0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E $ `- }, h' o; n% s, p2 u0 c, N- |0012BEFC 00B2D6C8 \pModule = "kernel32.dll" 1 J5 O: Y' n. l! m0012BF00 00B2E670 ASCII "VirtualFree"

/ M% g( S6 z. {- X3 @( w

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

; O3 A# _1 s! v, L7 Q

堆栈内容

& w5 ]8 U6 u- S+ h* X# y

0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995 & N/ Y+ y, h7 p! K3 ?; D# _0012BC74 0012BDAC \pModule = "kernel32.dll"

8 p- V3 M: h5 \2 T A

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

) R- u" T, I3 Y8 q; M3 z+ c

Ctrl+F9 返回。

% h5 j% i/ B& `2 M' r& ?1 I* n

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA9 ]( W- _ @2 c: O& X 00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]9 q) H1 a) _5 z# [8 j 00B079A1 89040E mov dword ptr ds:[esi+ecx],eax* N6 \2 |/ ~' u2 \3 V- k- U 00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0] # W+ i/ }! b' Z, G8 H V00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi7 ~6 }, [2 w) l 00B079AC 75 16 jnz short 00B079C4; l8 b' h4 D: i3 \: t+ d 00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]. b! H$ N) O( G1 ~ 00B079B4 50 push eax ! n# U8 u- C+ I; M7 E00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA; g, v- @8 P+ [ M& r7 w 00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] " V; E$ c% d( ?2 @: N00B079C1 89040E mov dword ptr ds:[esi+ecx],eax0 r' R- p% n# r0 N' s 00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0] 0 q0 H, L/ Q8 n+ e' m# P9 c00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi$ }! J5 g3 \, f6 ~- M" n 00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。

7 \# h6 F# a2 O- {4 Q& W5 Y

改为

. v- F/ d! Z/ Z8 j( R* b

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA % j0 T6 H7 A$ W( Q00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 5 B1 a, {4 {6 C" B00B079A1 89040E mov dword ptr ds:[esi+ecx],eax 9 K+ k/ q: D* P) d8 g& J5 d1 {00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]2 \- w6 U" c, T' M' S" X 00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi ( G- m- q2 @) s. g* J( `; g, ~00B079AC 75 16 jnz short 00B079C4 % l2 J# I, B5 H' y: s00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]! v) ]& j& @& S% g/ l 00B079B4 50 push eax6 e. v* ?1 t+ x; X$ f, a( X 00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA ( @9 Q6 t5 _% E" C4 R00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]* w% A: Q' z! x6 @5 t0 b% l& N! ? 00B079C1 89040E mov dword ptr ds:[esi+ecx],eax8 ^( x1 E) h* D& ` 00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]7 e& R! L0 A; K' g2 d& Y4 \: P! f 00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi - c: c3 w3 [( G00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)

* {0 F4 l" M+ v. v( d

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

* e2 P# d8 D; O9 H4 E

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

! N* C5 ]2 m8 h6 n

00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里( V) T/ a4 P1 X9 l n- B4 ?; F 00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]+ p' v; \( `) a" K 00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260! [' U2 ~( H; M% W! o 00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4] " \) B8 Q3 y8 g3 z- e4 H* p00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260, X2 W1 B" `- R9 B b+ O 00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74] 3 V, P7 F, J9 R6 Y: ^' Q5 o00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 % p0 e7 @5 M( k3 \+ p00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30] 4 I Z e5 ~' z) G/ W. u9 v00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952606 Q$ C" R. ~ C5 d# Z/ e 00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]

1 w! w( g) n9 y7 M9 X

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

$ e# y; Y/ e! J

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

' O! u8 B8 v t+ l+ _ d

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

' t0 L6 X6 w* M: p' g# m; C) Y

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

3 S, d5 O1 ^/ n. y

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

, n' q5 h- `* Z& F

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

; E d4 d5 D1 [" J+ p

77E7A6CF K> 55 push ebp //来到这里,F2清除断点 4 f7 ]' G& S, z, q77E7A6D0 8BEC mov ebp,esp* N7 y4 k/ K- p5 {+ |) P* `' u" a 77E7A6D2 81EC 9C000000 sub esp,9C 8 x5 F* V% I0 O; Q2 y77E7A6D8 53 push ebx Z# d- g, S- {- z. i2 d6 S3 K/ Q77E7A6D9 56 push esi/ w' Q+ A$ S* r# \, Z8 O0 W 77E7A6DA 57 push edi






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