菜鸟手动脱Armadillo CopyMem-ll +Debug-Blocker壳全过程,超详细。。。 【使用工具】 Ollydbg,Loadpe,Imprec1.6F
【脱壳平台】 Win2K
【软件名称】 按键精灵3 V3.11
& Z! m, W; j; J* {- K( {0 P3 g# D1 C/ J【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks
【保护方式】 Armadillo CopyMem-ll +Debug-Blocker
4 D. z0 S8 y6 m- u【脱壳人】飞舞的T恤0 h5 {; N1 X6 N7 I& w --------------------------------------------------------------------------------
【脱壳内容】
小弟第一次手动脱壳就碰上了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]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。
OD载入程序,插件自动隐藏OD,忽略所有异常。
$ s v8 U( }3 m3 x00485000 按> $Content$nbsp; 60 pushad //外壳入口 00485001 . E8 00000000 call 按键精灵.00485006 00485006 $Content$nbsp; 5D pop ebp 00485007 . 50 push eax 00485008 . 51 push ecx 00485009 . EB 0F jmp short 按键精灵.0048501A .....................................................................
0 K- _* {, l" @命令行下断点 BP OpenMutexA,F9运行。
中断
77E6C503 K> 55 push ebp+ g' N3 P, Y: e1 i 77E6C504 8BEC mov ebp,esp 77E6C506 51 push ecx 77E6C507 51 push ecx 77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0 77E6C50C 56 push esi 77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D .....................................................................
堆栈内容
0012F574 0045C5F1 /CALL 到 OpenMutexA 0012F578 001F0001 |Access = 1F0001 0012F57C 00000000 |Inheritable = FALSE 0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。
1 B }7 U& i! k找一块程序领空空地址,写入一些欺骗Arm的代码。
Ctrl+G 401000
00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。 00401002 0000 ADD BYTE PTR DS:[EAX],AL 00401004 0000 ADD BYTE PTR DS:[EAX],AL 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 LOD直接双击修改,填入以下代码。
00401000 60 pushad! b0 q9 z) i }) A 00401001 9C pushfd 00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140" 00401007 33C0 xor eax,eax2 q ^* n" B3 ~* n9 s 00401009 50 push eax 0040100A 50 push eax 0040100B E8 6D97A677 call KERNEL32.CreateMutexA: v3 Q6 v0 P ]8 J! n2 b5 N 00401010 9D popfd 00401011 61 popad 00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA ............................................................
" |& z) e2 P# O6 s' O将当前的 Eip 77E6C503 切换到 401000 来。
点右键 选在此处新建 Eip ,看到Eip 变为 401000
& G# V# r7 {: CF9运行。
中断
' [7 [% W* b. f& [( A2 i6 h7 ]77E6C503 K> 55 push ebp //双击它或F2清除断点。 77E6C504 8BEC mov ebp,esp' r0 x q0 ~. F" U0 H& N% E, g n2 u. \ 77E6C506 51 push ecx 77E6C507 51 push ecx 77E6C508 837D 10 00 cmp dword ptr ss:[ebp+10],0 77E6C50C 56 push esi 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: j77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。 77E63DFD 8BEC mov ebp,esp 77E63DFF 837D 08 00 cmp dword ptr ss:[ebp+8],0 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 77E63E0F 74 08 je short KERNEL32.77E63E19 77E63E11 FF70 04 push dword ptr ds:[eax+4] 77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW 77E63E19 5D pop ebp 77E63E1A C2 0400 retn 4. b6 k9 F: V0 l2 H ........................................................................
$ U" h! z2 d; |' TF9运行,多次硬件中断,注意堆栈值。
% R" U% f5 x G2 D/ b7次F9提示一个非法指令错误,Shift+F9忽略。# Q' y4 k; D. ~. i 0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801 0012BEFC 00B2D6C8 \pModule = "kernel32.dll"% b2 ?: M4 e2 d 0012BF00 00B2E67C ASCII "VirtualAlloc"
0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E 0012BEFC 00B2D6C8 \pModule = "kernel32.dll" 0012BF00 00B2E670 ASCII "VirtualFree"
9次F9提示一个非法指令错误,Shift+F9忽略。
; O3 A# _1 s! v, L7 Q堆栈内容
& w5 ]8 U6 u- S+ h* X# y0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995 0012BC74 0012BDAC \pModule = "kernel32.dll"
8 p- V3 M: h5 \2 T A点调试菜单,里面清除硬件断点。
) R- u" T, I3 Y8 q; M3 z+ cCtrl+F9 返回。
% h5 j% i/ B& `2 M' r& ?1 I* n00B07995 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] 00B079A9 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 00B079B5 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] 00B079C1 89040E mov dword ptr ds:[esi+ecx],eax0 r' R- p% n# r0 N' s 00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0] 00B079C9 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* b00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA 00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0] 00B079A1 89040E mov dword ptr ds:[esi+ecx],eax 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 00B079AC 75 16 jnz short 00B079C4 00B079AE 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 00B079BB 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 00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)
.........................................................
清除所有断点。在401000段下内存断点,按F9
! N* C5 ]2 m8 h6 n00B206B2 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] 00B206C1 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] 00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260 00B206D0 3341 30 xor eax,dword ptr ds:[ecx+30] 00B206D3 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]
提示被调试程序无法处理异常,Shift+F9忽略,game over程序退出。
天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”
想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,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+ p77E7A6CF K> 55 push ebp //来到这里,F2清除断点 77E7A6D0 8BEC mov ebp,esp* N7 y4 k/ K- p5 {+ |) P* `' u" a 77E7A6D2 81EC 9C000000 sub esp,9C 77E7A6D8 53 push ebx 77E7A6D9 56 push esi/ w' Q+ A$ S* r# \, Z8 O0 W 77E7A6DA 57 push edi
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |