QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3436|回复: 0
打印 上一主题 下一主题

菜鸟手动脱壳全过程,超详细~~~

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-20 14:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 1 |1 [- e/ K4 f) V$ @: \【使用工具】 Ollydbg,Loadpe,Imprec1.6F

0 w5 L* g1 z5 P, M b; Z

【脱壳平台】 Win2K

& H1 H0 r {- m, y/ J4 I5 t

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

+ k5 G' \8 H) e

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

. e2 X/ F6 B- |* Q

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

/ j) C' D6 e7 s4 K

【脱壳人】飞舞的T恤/ p! L( O2 d: f; l$ r8 x* D1 n --------------------------------------------------------------------------------

& z5 Y, h' e0 e2 k6 i8 M$ X

【脱壳内容】

9 k+ |& L/ }4 \7 B

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

0 Q, P/ U- Y: e0 k: |. z( u, z( J

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

0 Z. O* Y- g; S

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

4 P5 u' J# k2 C

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

1 V9 ?3 p0 T3 C

00485000 按> $Content$nbsp; 60 pushad //外壳入口/ b- d3 t+ [7 n 00485001 . E8 00000000 call 按键精灵.004850065 B7 y" S6 ]9 F( x& g) E 00485006 $Content$nbsp; 5D pop ebp ( P' N G" | R+ f& U4 G5 L00485007 . 50 push eax 4 ~% q! t& s, R% Q" M; E* Q00485008 . 51 push ecx 4 [: z% Y3 }1 V) J! R* @00485009 . EB 0F jmp short 按键精灵.0048501A ! R, F4 w) Q" u' f8 L4 y.....................................................................

9 `7 K, k" c1 N# l1 K

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

5 S6 o- N) ~3 P/ \* K9 Q* b* X

中断

5 L: S- o( X1 f4 W3 j8 `: z

77E6C503 K> 55 push ebp / Q5 N" [$ i# C8 D& ~% U) ]77E6C504 8BEC mov ebp,esp 8 C8 @3 {9 ~+ I" a# f- s9 M77E6C506 51 push ecx # W% [7 u2 a4 A& b77E6C507 51 push ecx2 c- E5 A/ \+ _6 D% h' L! _+ C 77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0, C$ h9 k; T; `8 ^) n 77E6C50C 56 push esi " m' P3 g. w3 f, z S77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D: Q4 f' j2 `/ u5 X' R% {8 c .....................................................................

* a8 ?/ J) _- E0 v- p# C( D

堆栈内容

' H% }9 A, v5 D% r9 V

0012F574 0045C5F1 /CALL 到 OpenMutexA 8 o+ f" ]% W+ P) i- R/ s0012F578 001F0001 |Access = 1F0001 $ o, i3 ], X6 l7 }7 v0 a4 l H+ g5 ~0 T0012F57C 00000000 |Inheritable = FALSE 1 ^6 v2 N- b; ^0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。

0 m& k) p9 p4 n( ]1 f

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

4 P5 j0 n; v8 S7 }3 u# s- n. u

Ctrl+G 401000

- z7 Q3 s2 B1 U; |0 y8 y2 N; W

00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。 o* w7 W0 r- }) ?00401002 0000 ADD BYTE PTR DS:[EAX],AL - ^# }1 b/ c, K. X3 [00401004 0000 ADD BYTE PTR DS:[EAX],AL Q X$ m% q7 F8 O) J- q& p 00401006 0000 ADD BYTE PTR DS:[EAX],AL' j' g- d; h1 M, B2 R1 \ 00401008 0000 ADD BYTE PTR DS:[EAX],AL 7 Q P0 d$ f& T) ^ b6 [& b+ |0040100A 0000 ADD BYTE PTR DS:[EAX],AL2 I+ a n( K+ U \/ m' i& b6 p& t 0040100C 0000 ADD BYTE PTR DS:[EAX],AL 2 b# F( T( O/ n7 b2 M3 m0040100E 0000 ADD BYTE PTR DS:[EAX],AL

/ r+ `8 @ ?+ T7 j+ ]& c! }9 j0 V

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

$ n% q. u, G# K: e& L1 U

00401000 60 pushad ( U$ K# x4 |7 y# W7 ^# G) x00401001 9C pushfd 0 H" L; b6 F- }/ x3 b; \00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140" 1 L8 g* M# @; X4 @$ Y. o00401007 33C0 xor eax,eax& B9 W( N; Y3 U9 L/ X" U% @0 y 00401009 50 push eax , x; }. R* l) ^8 b0040100A 50 push eax $ q7 \( Y# D- A0040100B E8 6D97A677 call KERNEL32.CreateMutexA. r+ c: r; R1 p' s( a4 m1 N; T 00401010 9D popfd- L% Z/ I8 s) j! P5 l0 {. e 00401011 61 popad. u* @$ ]2 X5 C' \' X 00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA, }8 v: ?! ]" {, F9 g$ A# U ............................................................

# P, k% f8 d6 Q6 ?4 h% k

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

; T3 f! J% |( ~

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

3 O$ d' y5 l, n

F9运行。

- b* _1 t4 m+ W* D

中断

. e! m) M0 ~' _+ }: o4 Z5 Y9 r& }& g

77E6C503 K> 55 push ebp //双击它或F2清除断点。6 F! W# N( E) q 77E6C504 8BEC mov ebp,esp ( ]2 d# q- |' \- N2 Y77E6C506 51 push ecx, g% Q; n( m$ l: F8 C 77E6C507 51 push ecx! G3 U j/ F. V) |" U2 w4 a 77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0 , V" ]. ^# l3 H5 l* H77E6C50C 56 push esi $ G9 B/ e5 I7 K0 S; `' z77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D' N7 D5 k% r x& d8 Q- r ............................................................

- }- H. R3 A( N4 P

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

f( s6 q) L( j( l, p- i( I

77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。. @" a; _2 z) k 77E63DFD 8BEC mov ebp,esp* ]( \4 g3 ?+ C( D 77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],06 Y% `4 B* ?; Z, B+ _. H5 K; e: d9 E 77E63E03 74 18 je short KERNEL32.77E63E1D E% L# g5 I- I3 J, }77E63E05 FF75 08 push dword ptr ss:[ebp+8] ) L& [3 }6 i3 l- L5 Z77E63E08 E8 87FFFFFF call KERNEL32.77E63D94 - `2 \2 p. ^4 ?9 B6 n$ `" Z77E63E0D 85C0 test eax,eax , O, \$ Q& J7 x* { W77E63E0F 74 08 je short KERNEL32.77E63E19 }7 k0 h O5 b8 ^+ F# h9 Z2 w 77E63E11 FF70 04 push dword ptr ds:[eax+4] ( r- x; P. h2 k% e' k0 r77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW 2 P8 ?8 G8 P8 k3 }+ {5 F8 B77E63E19 5D pop ebp- \+ p( i- g% f+ J 77E63E1A C2 0400 retn 4 4 }* L( t1 n( p. D........................................................................

9 }5 i; {+ L+ R; y3 ^+ }

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

8 J* w' y' n! R4 L% s. r* p, }

7次F9提示一个非法指令错误,Shift+F9忽略。. m+ t% v7 T0 g 0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801 ( D8 Q/ s$ _, z% g m4 } I0012BEFC 00B2D6C8 \pModule = "kernel32.dll"0 C5 D. T* u3 K' t" V* z, d 0012BF00 00B2E67C ASCII "VirtualAlloc"

- }; M$ A- O; O/ Q4 `- Y8 Y# k$ R

0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E 1 l9 ?1 h' U1 s4 K6 k9 y0012BEFC 00B2D6C8 \pModule = "kernel32.dll"5 d5 l! `+ \( @0 B/ x 0012BF00 00B2E670 ASCII "VirtualFree"

" w+ Y: `+ L" g" x0 P

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

- X1 x& B4 Q4 K0 x3 x& V6 I

堆栈内容

B' `- Z1 ^0 D* V ~

0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995' q7 A+ m0 q% @, q 0012BC74 0012BDAC \pModule = "kernel32.dll"

' j& X$ p* ~6 G3 t7 g6 o! \/ M

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

, c5 P: i& t O

Ctrl+F9 返回。

% w" ] z* `3 S( f$ M3 B* B' h) b

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA - P4 j2 a1 N; w2 _0 A- W! \00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]# `8 y7 E7 I# m' W1 T) p: @ 00B079A1 89040E mov dword ptr ds:[esi+ecx],eax 3 t6 m# p* z& B4 _3 X0 Z+ ^00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0] % v( e! C6 S) m+ w6 T+ K00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi 2 m7 K9 i1 m! l00B079AC 75 16 jnz short 00B079C4 5 G- }8 h1 J- h& q% ^: V00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]# M' D& \, ] ~- r 00B079B4 50 push eax ) @9 J. a+ `! U8 T00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA7 y2 i9 d' X! d- f) }; A 00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]$ C& v8 m. F M! _ 00B079C1 89040E mov dword ptr ds:[esi+ecx],eax ) B3 g4 R7 U1 X! w" l00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]! H4 T% `7 g/ h1 l 00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi" ?" l) B+ w1 ?5 k1 Q( ^0 d 00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。

* m# V+ _' _6 ] c( a1 a) m1 b, @3 ~

改为

5 ~0 P3 z3 h; I3 c

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA , ^* {' o. q/ a7 j. S' z00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]1 |& ^7 m! w' j# }- q 00B079A1 89040E mov dword ptr ds:[esi+ecx],eax % k' e7 A$ N5 W# d6 y2 l3 j00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0] 0 j5 r# w5 r4 m- s& E# ]/ {00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi0 V$ c4 k" m7 Q5 P) U 00B079AC 75 16 jnz short 00B079C4( c8 v4 a1 |( p9 c! i8 C3 t 00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]8 ^( @& T! N% U' T2 I 00B079B4 50 push eax P* b" ?* D0 }- G0 [8 `) g1 o; Q 00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA ' B" N, z9 \' j& k5 {- N00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 6 p6 _4 F2 c' [00B079C1 89040E mov dword ptr ds:[esi+ecx],eax& d/ s; j# d; k. @2 \& |; b 00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]! p- ?! k: W3 M" C* [. W 00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi f& u1 u& I A 00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)

8 |9 `; ~. L- n

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

# a v9 ]" i2 y7 M# z6 k( r+ s8 ~

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

; D1 u, P# `$ w1 M: P

00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里1 a0 E* P( Y7 F7 L9 ` 00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54] ) h3 n0 ^ y' e: X0 Y5 [2 d9 c6 \00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 . j0 p2 B- C$ J1 E00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]) N1 E7 }/ J& C9 n+ }6 c' j 00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952604 @; q9 Y! y" t) d6 H+ K 00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]/ v% I+ Z/ ^7 A& W' O# s5 w' w5 F; ^ 00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260: T/ L6 q0 J; J 00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]5 q9 a5 h1 u, X/ e+ \5 V 00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 ' Y3 _ x0 Q: o: P( S00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]

; m0 e) e) _. q8 H& F8 G' C

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

1 _0 m0 @; x8 e% r* l# n. T9 z$ r, ~

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

5 a5 w @! r/ O7 q; L

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

- V" [5 ^. j( d7 f3 Q8 W/ b7 Q8 f& n# g# }

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

9 H2 M. k3 K3 J

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

; _" t, j# a( |

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

3 l( D; F+ H* [2 A3 e' i9 M

77E7A6CF K> 55 push ebp //来到这里,F2清除断点 8 \( T ]1 R; k% `1 X& R77E7A6D0 8BEC mov ebp,esp & M$ b% P @1 k; F, _- U77E7A6D2 81EC 9C000000 sub esp,9C* k$ [$ A( y0 X( c( o7 x. n5 @- n 77E7A6D8 53 push ebx 0 p6 |5 i$ |; X. o" j* Z, K% G77E7A6D9 56 push esi. o& K$ E0 Y6 b6 y! x. F 77E7A6DA 57 push edi

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-18 14:18 , Processed in 0.343569 second(s), 52 queries .

回顶部