QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 9 J* F& U. t8 i/ n3 \ 【使用工具】 Ollydbg,Loadpe,Imprec1.6F

, x% b5 M7 X' z5 _- _+ u8 i

【脱壳平台】 Win2K

+ o& s; ~ R9 I$ ~

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

2 ?- h/ p. e, \. Z3 t% t$ R

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

9 j8 s R8 r! z* K& n

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

3 O3 u. x) h" y5 @9 A* g. w

【脱壳人】飞舞的T恤# _2 \) i5 [( l. ? --------------------------------------------------------------------------------

/ \/ u7 u) S% P6 y& s4 `

【脱壳内容】

8 t/ Z% M, ? y

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

7 n8 h" I. Y6 n6 t! ^3 B% D3 U: H; v: [

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

- S( B- T: C0 h" g5 i3 B

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

/ W, B4 q3 L$ y9 y: R

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

1 }: X6 h0 e" A4 p7 i6 L7 s3 g/ T

00485000 按> $Content$nbsp; 60 pushad //外壳入口2 ~- G! q2 y6 F* ~" c$ s7 x! u 00485001 . E8 00000000 call 按键精灵.00485006 $ I6 Z/ j3 S1 D7 a5 U00485006 $Content$nbsp; 5D pop ebp 7 W Z( ~: F1 m00485007 . 50 push eax9 F& T; u8 v2 y# i% { 00485008 . 51 push ecx $ C3 m0 L, j! b3 P6 I2 x Q+ o" D+ }00485009 . EB 0F jmp short 按键精灵.0048501A) O2 W' a% ] I5 l6 h- W% J8 g( D .....................................................................

2 P" m, X1 Z. Y6 z: B3 g- c

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

9 r6 ?# t) O; R' r

中断

8 u# v- p, y' L4 A" q

77E6C503 K> 55 push ebp 6 _- F+ f7 c& Y! p77E6C504 8BEC mov ebp,esp 6 E2 _5 }8 `; l* P* C77E6C506 51 push ecx/ N) S" ~; `3 `2 c$ k x 77E6C507 51 push ecx / X$ W7 ?2 S* B77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0 : n' R; [- N1 s77E6C50C 56 push esi 1 K. I3 {) _ ]$ _$ X6 z* x77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D - Z, x% {/ ?8 B" F9 T% b/ W( _.....................................................................

. L( c& I4 o& D0 w; _# ^

堆栈内容

# s4 Q$ v: g( [. i

0012F574 0045C5F1 /CALL 到 OpenMutexA 3 |: n4 E& r& T9 `2 L( S0012F578 001F0001 |Access = 1F0001 , ~9 Q+ L" i1 K. \0012F57C 00000000 |Inheritable = FALSE- C3 J* \( z3 B i 0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。

* ]1 P: G+ I8 g0 x$ o$ x

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

2 K) x7 m1 z' Z' U! [$ b

Ctrl+G 401000

$ e4 [1 q3 k* U; `- X& |

00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。+ p& I+ \; |; H- L: L. ?& ] 00401002 0000 ADD BYTE PTR DS:[EAX],AL- z! k( Q6 h: S$ M5 Y k& I- Q+ w7 ] 00401004 0000 ADD BYTE PTR DS:[EAX],AL/ E! {+ M6 I- Q: W- F1 L5 i# ~ 00401006 0000 ADD BYTE PTR DS:[EAX],AL , l0 _2 o' o. r K$ F00401008 0000 ADD BYTE PTR DS:[EAX],AL8 Y- }: Y, w, ?& @ O. G 0040100A 0000 ADD BYTE PTR DS:[EAX],AL# d0 i; A/ [- ~ F9 I- D m9 ]# a% W 0040100C 0000 ADD BYTE PTR DS:[EAX],AL Z# D; V$ a& q: O7 g3 Y: _ 0040100E 0000 ADD BYTE PTR DS:[EAX],AL

" a9 Q1 _( ?) I+ V, J

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

) I3 w& d. O. c/ V6 Z

00401000 60 pushad7 W1 h8 ^: _* T3 A! a% v4 W 00401001 9C pushfd+ A( U% G: A/ S7 p2 T 00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140" 2 B& d h- f" Y5 l2 I- R, q00401007 33C0 xor eax,eax+ \) ~1 A! n3 u* f2 L( V2 w9 Q# n2 e9 j 00401009 50 push eax v1 w- S* w9 F8 r0040100A 50 push eax 2 R" |/ B' q- g7 ?. {0040100B E8 6D97A677 call KERNEL32.CreateMutexA" p, ~9 r$ W+ I! E' u/ X: Y 00401010 9D popfd 1 q8 F7 C& l6 t W8 _' t+ `00401011 61 popad ! f2 \6 Y1 t* U2 K# P) p$ ?00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA 1 l! [3 y0 w: G* S9 P0 _" p............................................................

; K! S' q0 a- v) U" e7 i/ u1 l4 [/ D

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

J; B+ [1 q$ h) r+ I* c

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

; P: d) p9 | x+ X" \

F9运行。

8 g5 q5 O4 I7 P+ l

中断

7 ] I/ O+ L8 q8 D4 K

77E6C503 K> 55 push ebp //双击它或F2清除断点。 5 _' a2 _& V" H) o4 m6 b77E6C504 8BEC mov ebp,esp ; c) A+ U5 F1 c' C c$ U, d% J77E6C506 51 push ecx 1 |% I: |" D" V" F: C0 \77E6C507 51 push ecx 0 C0 n: q1 U& w- c' ]77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0; y) I( ` V: C+ @5 n7 d; j 77E6C50C 56 push esi) F* K" B2 S* M/ G+ _8 J 77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D 4 p/ A: S5 h% B' E. i............................................................

7 T2 O8 ?+ |+ M8 g

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

* s2 K6 ?& J. k

77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。: ?7 Q" Z0 `- m3 S) s; A3 c 77E63DFD 8BEC mov ebp,esp 0 d9 L& L* T1 a77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0& D& e7 q8 D; k. S 77E63E03 74 18 je short KERNEL32.77E63E1D( o0 E% p. U* h4 }' i 77E63E05 FF75 08 push dword ptr ss:[ebp+8]2 ]0 ~# e7 C( p. y 77E63E08 E8 87FFFFFF call KERNEL32.77E63D94 8 Z: \" u! a! W1 n. q7 k4 H; U# u77E63E0D 85C0 test eax,eax ; b9 p2 q1 C# b! E( S Y3 R1 Y" X$ z77E63E0F 74 08 je short KERNEL32.77E63E19 : f5 a; T2 J: T3 q4 P77E63E11 FF70 04 push dword ptr ds:[eax+4] 5 i( V: d9 i/ ]6 p2 K77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW ! C9 _ H. L# K4 e1 c9 V: {8 \' K) f77E63E19 5D pop ebp2 d& a% Y' ?, S( { 77E63E1A C2 0400 retn 4 " p1 k: T6 G3 O9 [/ Y. K........................................................................

4 }6 A' m- r! d5 O

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

! B; B4 C2 L! u8 V# D

7次F9提示一个非法指令错误,Shift+F9忽略。* K$ Z( J0 l* n" U% X 0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801 9 D3 @/ q2 W% x" @! }0012BEFC 00B2D6C8 \pModule = "kernel32.dll"0 X& C/ i" k& I7 e* b( N 0012BF00 00B2E67C ASCII "VirtualAlloc"

% ]6 ]2 L) z% s5 J

0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E , K8 `" k2 O" P6 N) O \0012BEFC 00B2D6C8 \pModule = "kernel32.dll" 1 H& b0 d# m9 N4 m+ X4 p0012BF00 00B2E670 ASCII "VirtualFree"

, r& R) [% K+ ]$ c' X, `6 G; G8 V9 t

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

- k. `* f% H5 J# _! i

堆栈内容

7 |( D7 q* A% U' q# b7 m" t9 }2 C

0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995. l) {- |9 L: q5 b 0012BC74 0012BDAC \pModule = "kernel32.dll"

2 Z7 ^9 e7 @4 {+ y: I+ v& l4 ~3 e" s

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

/ ?% n1 S* n$ q" @! W8 b; m4 c

Ctrl+F9 返回。

% h- [- |2 |8 x+ a8 W% y' I

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA( P% Y, D t O' I# f) [ 00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 6 B( r% d' _+ R4 l1 B) ?00B079A1 89040E mov dword ptr ds:[esi+ecx],eax # w" ~) G, j& P' a2 f00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0] . C" y% D/ ?5 F& d00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi; z3 f+ W( |/ F: ` i5 C 00B079AC 75 16 jnz short 00B079C4 " s6 S5 J) A7 w5 N m, R9 E# L00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]( U8 I: w9 Q, b5 F& o( W$ s: G) g 00B079B4 50 push eax4 V* {' J. J- c& ?+ h y 00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA- t% H4 c+ s) s$ X% B1 b 00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]4 e3 L* d- W3 i$ _) G" H6 K 00B079C1 89040E mov dword ptr ds:[esi+ecx],eax [! s- w6 X/ g6 ]/ m 00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0] + i9 X" L ` F% R00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi2 {4 S& w8 c. t6 [ _ 00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。

, F0 t: _) Z# n2 Z

改为

$ w1 m, w6 U' `5 p

00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA ; a; Z: x k' O2 K6 d$ d2 I& a00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]) f5 O' E/ y: O6 ^ 00B079A1 89040E mov dword ptr ds:[esi+ecx],eax ~) ?' A, `8 X) v$ F( o 00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]/ K. R2 l( {& f$ x* X' u7 V+ r 00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi$ M( k; u6 D4 i5 U 00B079AC 75 16 jnz short 00B079C4 ) }! Q6 [, _7 }( e# j* h( l8 V00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]3 d2 { T* d) e9 n( R 00B079B4 50 push eax 1 n7 I' n9 N: U' n2 y. S00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA) Z& q: G! G5 F9 P 00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] # p/ o! w# F& H" R( d3 |00B079C1 89040E mov dword ptr ds:[esi+ecx],eax / l( @: ?+ A. i00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]0 W* ?! f( p: |3 a) X$ C9 x- f 00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi ( m; s9 l, C# t00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)

Z5 g& A% ~$ g: [

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

* c( P& I" ~1 p, \8 k1 N* Y

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

0 K. r3 h, \4 x

00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里1 b3 }7 i- ^; G- ]) X3 J 00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]' ]* D2 ?1 {3 N1 l# o/ k 00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952604 q" e" l1 @: {% \+ r9 \0 a# O 00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]2 z! N& ]: h+ O5 F) n& T 00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260' z. B5 g; {) C! F0 d/ \# n 00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74] ' b& x* a* h3 F00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 , W/ j0 i( [5 U7 t00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30] : I; {; H0 O0 j' V# w00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260) Y. d+ N; h& p& E2 B; Q! T a& E D! B 00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]

3 ]5 K% F# H) i/ z1 G

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

( m3 h8 |% P i6 ~0 W4 M

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

5 ^. s( |' a% }& P

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

' j# Y$ {4 ]+ Z0 V, U

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

6 e! P0 D/ @. } g9 m5 W5 A

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

+ [' L4 {) e! Z1 s

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

" V9 E4 A. e& O) s) {

77E7A6CF K> 55 push ebp //来到这里,F2清除断点 " q& [. W& @. Z# r- g; Q, ^77E7A6D0 8BEC mov ebp,esp% O/ R" T4 D; }: n$ S# r1 | 77E7A6D2 81EC 9C000000 sub esp,9C; F. t9 F7 }/ a, h* K 77E7A6D8 53 push ebx ; t) q7 z7 S# D# F$ l& `0 a77E7A6D9 56 push esi( K2 g! g4 i2 H, c* q8 X5 F/ O! C/ @+ x# q 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 16:12 , Processed in 0.362292 second(s), 52 queries .

回顶部