|
菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。
- i0 d/ k: w- k- g2 u【使用工具】 Ollydbg,Loadpe,Imprec1.6F
; C* P: Q- ?) K- {【脱壳平台】 Win2K 4 k; o! p8 D, V+ h V6 D5 @
【软件名称】 按键精灵3 V3.11
1 H. X& \$ D1 O3 S& {【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks
+ |" _- t$ I% i: z2 E4 G) `9 r【保护方式】 Armadillo CopyMem-ll +Debug-Blocker 9 {: g5 ?1 Y1 O" R
【脱壳人】飞舞的T恤8 \# c) T9 [/ G9 `7 C$ F' h5 G- C
--------------------------------------------------------------------------------
i ^3 K/ y& }: ^【脱壳内容】 ; ^$ H. w# D/ j/ A4 @$ g! Q
小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll +Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll +Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll +Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。
" c' A z! w; V6 x6 r+ P小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。 + S3 m$ ^ v0 @) r
用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
: ^ s( |8 t6 ~& ?) {OD载入程序,插件自动隐藏OD,忽略所有异常。 4 x' x3 P3 L& |6 f
00485000 按> $Content$nbsp; 60 pushad //外壳入口
; f6 E" j, @+ c* o0 ?# v00485001 . E8 00000000 call 按键精灵.00485006
) A8 l2 n# ^) G- J00485006 $Content$nbsp; 5D pop ebp
/ [" @! M7 K+ J8 z; {0 F- L00485007 . 50 push eax& s) U! `( Y. n9 {$ M
00485008 . 51 push ecx6 \0 `7 T9 U% L- y$ p
00485009 . EB 0F jmp short 按键精灵.0048501A0 s; I- ^6 ?% J4 V: J, b" N' C
..................................................................... 3 W; h8 C3 p( r/ `9 w
命令行下断点 BP OpenMutexA,F9运行。
/ s" [ \" v$ ~) }0 b& N4 C7 d3 s* N. i中断 5 n# A7 R, D, U8 W, P& F1 l( A
77E6C503 K> 55 push ebp
! |# G9 M7 P4 X6 n77E6C504 8BEC mov ebp,esp$ J# W/ H6 Q( J6 b
77E6C506 51 push ecx% _; A/ x, X: P& M" R
77E6C507 51 push ecx' J3 q3 E: Z8 `6 F& ?
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
* t' P9 [0 d) v$ A% `5 |77E6C50C 56 push esi) {3 @" H8 {" Z+ Q
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D
( I5 H @* r3 m& U( w0 i& X+ }5 x.....................................................................
- [) o3 u' U/ e7 m @: ]堆栈内容 ' C z- E6 \, x9 @1 C
0012F574 0045C5F1 /CALL 到 OpenMutexA
4 n5 R6 |( G- l6 W9 Y+ k0012F578 001F0001 |Access = 1F00018 d, p. L( [* y3 l
0012F57C 00000000 |Inheritable = FALSE
/ T( x) ^; h: e- }0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。
1 X! ~/ O( C/ i找一块程序领空空地址,写入一些欺骗Arm的代码。 & K8 P8 C* U$ f% h# u9 [* j
Ctrl+G 401000 2 A' F( g$ u6 W: J# T
00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。; |6 e/ O3 M! c) w) W9 w- v/ m
00401002 0000 ADD BYTE PTR DS:[EAX],AL
: }! V; E6 X. D00401004 0000 ADD BYTE PTR DS:[EAX],AL
0 X2 c2 c0 |& K! W00401006 0000 ADD BYTE PTR DS:[EAX],AL$ q v+ {% t% V3 f
00401008 0000 ADD BYTE PTR DS:[EAX],AL h& X+ U' I" U% `
0040100A 0000 ADD BYTE PTR DS:[EAX],AL
" k( @4 O U8 p! E3 N0040100C 0000 ADD BYTE PTR DS:[EAX],AL0 k5 h; H. ]! S$ C
0040100E 0000 ADD BYTE PTR DS:[EAX],AL ( |2 U" ~8 J: x b
OD直接双击修改,填入以下代码。
2 k8 b, P" q+ Q5 F00401000 60 pushad7 q* U! K4 n. ^: X
00401001 9C pushfd, `) \6 l3 M2 U
00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140") a& k6 t" H8 q. {! U
00401007 33C0 xor eax,eax2 ^8 w+ W4 x" f1 t# j# \9 d* D
00401009 50 push eax
) r+ s: ^8 _! _, T% e8 g7 p' A0040100A 50 push eax8 m# X5 ~% o- z, d$ T
0040100B E8 6D97A677 call KERNEL32.CreateMutexA i# K8 |$ g! }1 r& _
00401010 9D popfd/ ^0 [+ W4 [2 `! r1 X
00401011 61 popad, M; f# s# N6 |9 P
00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA+ A5 ?3 o2 E5 Q0 `8 b' Y; r/ O1 \
............................................................ ' o$ c7 ]5 p/ \: C7 k& P) o8 Q
将当前的 Eip 77E6C503 切换到 401000 来。
. A/ `5 v5 j% @7 i. x点右键 选在此处新建 Eip ,看到Eip 变为 401000 6 X1 ?$ c; t, r
F9运行。 / }6 N+ ~$ W$ N4 j9 u
中断
2 x/ |! K6 [0 S1 k77E6C503 K> 55 push ebp //双击它或F2清除断点。
, V8 N) f0 |8 e: r77E6C504 8BEC mov ebp,esp
1 p% V2 i9 a7 k' y O5 I77E6C506 51 push ecx; T/ q R4 ^8 h$ P2 }+ j
77E6C507 51 push ecx* S/ N5 [. J m0 A0 i
77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0
$ R; e" F3 l) N+ \! |' M77E6C50C 56 push esi4 L7 g) A* o- b( b
77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D* T g t, D" y
............................................................
) h: ~/ z. |- u: ?% W' _, q找 magic jmp 命令行下断点,bp GetModuleHandleA 8 F; `, j7 e! ~$ x' y5 G2 B
77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。
; K( J6 p/ ~" J8 r77E63DFD 8BEC mov ebp,esp
. _+ s% J5 I; B2 S6 W' B77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],09 r$ S. ]/ m, r7 Q3 Q
77E63E03 74 18 je short KERNEL32.77E63E1D
5 r- o% F1 p) q P2 [77E63E05 FF75 08 push dword ptr ss:[ebp+8] c6 N' Q1 B% M& ^/ `. G0 f
77E63E08 E8 87FFFFFF call KERNEL32.77E63D94
- u2 U _9 k+ f, Q" e( ]77E63E0D 85C0 test eax,eax' j! t8 B: Q M q, Q& c
77E63E0F 74 08 je short KERNEL32.77E63E19
; }3 ], U, L$ d! z77E63E11 FF70 04 push dword ptr ds:[eax+4]& U# ?5 m0 K1 H& `8 t r
77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW
7 C/ {' I5 ?$ q; E/ K77E63E19 5D pop ebp0 L5 ]7 \" [+ Z) B+ }
77E63E1A C2 0400 retn 4
) \; A {; u7 Z8 T) z........................................................................
, ~' Z8 c4 A! E3 M4 H" ^) |9 ?; s4 N: TF9运行,多次硬件中断,注意堆栈值。
% z# c) P1 I3 c- U7次F9提示一个非法指令错误,Shift+F9忽略。& o: z9 V4 D( @7 w, X& N. \
0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801
# r: d( \2 Y/ W# A$ q% z0 N* l1 I0012BEFC 00B2D6C8 \pModule = "kernel32.dll"
; ~3 O2 o0 I% ^% F0012BF00 00B2E67C ASCII "VirtualAlloc" 3 T% j- C+ ~8 _
0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E
) D4 w3 n) K- F* Z. X4 l' g/ T0012BEFC 00B2D6C8 \pModule = "kernel32.dll": L, Z a, z) P _
0012BF00 00B2E670 ASCII "VirtualFree"
; y7 p1 \+ B" Z1 D* p9次F9提示一个非法指令错误,Shift+F9忽略。
2 R, M |& v/ r% I/ V. M* h, R+ |堆栈内容
, p& c F c- N! O0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995
% Y6 Y6 F- h" L6 a0 y/ H& F0012BC74 0012BDAC \pModule = "kernel32.dll"
# w: J/ c8 P$ M. O点调试菜单,里面清除硬件断点。
* X& E/ m: y9 C& g7 W$ Q/ sCtrl+F9 返回。 " G* p' ?% b: ]* h; ]1 {4 p. N; e1 C
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA- q% N9 S) ^/ k; y3 y
00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]" N: h% J6 G; V* g
00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
: M/ N8 J; J. L. h9 ?( e$ y00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]1 T+ E6 K3 z6 S2 m, r! R
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi3 }" t( ?' d$ C2 e v$ j9 l
00B079AC 75 16 jnz short 00B079C41 V; q& [. I( Q/ Q. B, p. t
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]1 f9 H# w- K2 Q! z& U# e* A
00B079B4 50 push eax S) _$ U( A# B
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA( E/ c; Z/ K% Z- N8 Y% M
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]! {7 `8 n2 c i; i; O
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax5 Y$ ^+ a; S. ^) e- _4 c, B
00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
" k6 _0 M. b* b/ d) Y/ O7 M+ |0 ^00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
: t& z; f( Y+ i7 y8 O' x00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。 / e9 }! C( z2 a: S: ]
改为 j9 X3 p/ p( k
00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
! W( n+ X* x) Q* H7 M% I) C00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
1 l; }. Y% Z' V' ]2 E: w/ Z00B079A1 89040E mov dword ptr ds:[esi+ecx],eax
4 P+ w' j5 f7 u# { C00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]4 p# i/ ?" S. |& N5 W/ y0 g R+ k4 z, Y
00B079A9 393C06 cmp dword ptr ds:[esi+eax],edi& ^; g. b2 i* [. _% j( S! k& _
00B079AC 75 16 jnz short 00B079C4, ]; N/ @* S, v
00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]9 P8 q1 E5 | a3 x' Q+ [
00B079B4 50 push eax% N- }; }6 M! ]9 T1 L# Q/ z
00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA, Q$ b3 E) S' J. j) T3 W
00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]# e7 O7 I7 j% o5 d% v1 J, m
00B079C1 89040E mov dword ptr ds:[esi+ecx],eax
2 P3 }3 ~6 r6 N/ g( `00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]( [' w1 g, V4 N! B" A7 p
00B079C9 393C06 cmp dword ptr ds:[esi+eax],edi
( S, g, ]* ~- {8 H3 I+ @00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)
5 x5 a h: Q3 R/ }.........................................................
" `! \) N7 G7 e: A A4 X清除所有断点。在401000段下内存断点,按F9 ( n& ^* Q4 s" g9 ~- q
00B206B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4] //来到这里
( v; g5 P, f9 W7 y0 N3 K& [& ?00B206B5 3341 54 xor eax,dword ptr ds:[ecx+54]
' p1 `! A/ z# M2 J/ U00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.004952609 ~0 L, v% J9 v/ N
00B206BE 3341 04 xor eax,dword ptr ds:[ecx+4]
8 t O5 I# k+ N. I00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
2 u7 H; A* p# F6 W: } t00B206C7 3341 74 xor eax,dword ptr ds:[ecx+74]
0 H( Y* [1 Y9 d00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260
1 k3 v$ t; R2 ]$ }4 f00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30]
3 L" E6 y1 c; M/ ^* O1 a00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260" R! C& i% |3 T) t
00B206D9 3341 20 xor eax,dword ptr ds:[ecx+20]
; |3 r( @3 D" k) I* u提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。 2 e! p& Q% L) a. o4 Q4 `
天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”
* ` X! M: n2 J# H# p% j想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。
/ M4 ?5 E& S/ r+ i期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^
# r# q' o% D: b4 f/ Z后来还多亏wangli_com大大的指点。。。 + d; Z' ^- I& g1 f1 O/ q) `
先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行
# ]! v) s1 m1 @$ u! B77E7A6CF K> 55 push ebp //来到这里,F2清除断点
+ m8 y. R. A& I* w* d77E7A6D0 8BEC mov ebp,esp
& H/ B4 l" ~' {77E7A6D2 81EC 9C000000 sub esp,9C
# v. p' n( P- ` D) w' v6 v. U+ s77E7A6D8 53 push ebx
! x' H2 e% ^! y; r' D g6 F77E7A6D9 56 push esi
& r& z3 X, u w% Q+ ^# {77E7A6DA 57 push edi |