|
作者:jwh51 来自:看雪论坛
/ `3 A, D6 J1 s" Q
8 R2 B0 ^! @2 F8 `, ^新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. ( _ @3 G. H# Q+ U, `, w/ a+ O9 K! m
用OD载入,BP IsDebuggerPresent,F9,停了下来: 4 K& q, |$ a4 p2 ^, T, @; R a& [! x
77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] ! P; i X/ Z' w1 ]! H
77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30]
$ K) q! S2 A9 \1 r: V6 g" y( S77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2]
9 T0 }) H c$ N3 j77E5274D C3 RETN - a, |2 ?- l& Y3 S( o; z/ `
0 o0 C5 r, ?/ w5 k& v: M& u
F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01,
+ t6 F0 F4 y4 N! ~+ Y8 ?/ S! l& f5 U重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码
# x7 h1 W8 C* a3 M$ x00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 3 ?. ~) R9 b$ y8 V* E8 m
00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0] + N& h% a4 Q- m" }# T. W
00C23D68 58 POP EAX % |* q4 s! Y/ L% `
00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0
7 U, l: d' l& i, k N6 v" H00C23D70 74 14 JE SHORT 00C23D86
2 }7 H6 ?& T6 t, K% w% D! E( O% R00C23D72 6A 0C PUSH 0C % d" U+ [1 A, Z4 U _4 {6 ]6 Q
00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC : \+ I# I* P5 c* e' a$ Y* m- V
00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8]
3 K7 L" C: b1 K00C23D7C BA 04000000 MOV EDX, 4 7 G1 N* g8 a3 _9 T |4 z
00C23D81 E8 8ED2FFFF CALL 00C21014
9 K2 ?- R3 H H3 a3 ^* I00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] 1 g* E! Z Y6 o1 D6 W
00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
6 g( e/ z2 {' F+ u, B, a( E/ V00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] $ l( ] n9 v* N h. k* F
00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0
: Q- C V I* |& c- E6 r00C23D92 74 02 JE SHORT 00C23D96
+ O' C1 {2 ~# a& f2 O: k$ M00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 4 ^8 M; [1 p9 `. ` W
00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
( k$ j. `( a4 d7 L- F& V. l00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14]
8 y$ Z6 z6 o8 k z+ y00C23D9C C3 RETN ; M0 k0 B4 D2 j
这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 2 N1 |( Q- k" Q1 x; {" S5 _% _
Address size section contains 9 E0 p3 H% k D- T
00401000 00161000 code 1 e8 [1 {9 Y% { w& K
在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 0 h1 b4 X; W/ n/ J- S% Y; Y4 P
00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] ! n3 ^9 h; L. Z, Q
0040727E 8BC0 MOV EAX, EAX
( ?' `- H1 t* s00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328]
% ]. @7 j! o/ m9 ^/ N/ U# v00407286 8BC0 MOV EAX, EAX " Z4 A& c$ m! t
00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324]
- {; h4 l2 f) Z" v0040728E 8BC0 MOV EAX, EAX
1 V8 H! P' W, U2 z00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] , O/ r9 c2 @5 ?0 F+ o1 }
00407296 8BC0 MOV EAX, EAX
. P* [, G2 O; t/ {4 d4 J9 {0 Q6 I00407298 50 PUSH EAX
# K3 o. t2 U! [( ^5 Z00407299 6A 40 PUSH 40
6 L5 I9 B: E3 N' ?3 r/ S0040729B E8 E0FFFFFF CALL SystemCl.00407280 ( q/ G; g/ b; H' c+ f! Y; \
004072A0 C3 RETN
% l. [4 k2 w8 D( X这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这:
: b- t6 O- t6 _- e0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000
$ d4 `5 U0 j1 O8 _: c9 Z00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668]
- T# g, C+ V; d) V8 Q* f, m) K$ F00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX
1 Q% t4 a8 ?/ `2 M ?4 N0040735C 33C0 XOR EAX, EAX ) T% {5 X5 j) O7 [
0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX
; ?" S! O; ?7 X& x00407363 33C0 XOR EAX, EAX ; Q" o, O, [8 `1 }% s X" z! o: q9 e# o
00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX
2 H" n- d; B/ x$ f0040736A E8 C1FFFFFF CALL SystemCl.00407330
, C( a: P6 x* ]& n: Y0040736F BA D4205600 MOV EDX, SystemCl.005620D4 - Q; g5 r$ I) K X
00407374 8BC3 MOV EAX, EBX 5 |7 r( S2 H6 n9 D
00407376 E8 75D8FFFF CALL SystemCl.00404BF0
8 O5 F* f4 N1 _) p: F# B0040737B 5B POP EBX ; _+ Z6 B" h$ ]) u& E; h
0040737C C3 RETN
' ]$ F& @0 o$ w) I, a到这里我们要做3件事:
$ F, X; l+ {1 t1 t& _: {1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE.
2 H% G! q8 c6 L4 B( \6 s) d- L! j2,记下EBX的值560d08.
1 } C! _) f1 c0 a% o1 O, @1 p; \3,先修复好引入表,修复方法如下: ( ?7 Q, O5 k! k# j4 i- J% x
看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988,
# [3 E! W* P$ C7 l* ^# n# d- s: W5 a打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE.
8 H) o, T) e9 y下面就是修复入口处了. 6 E- l% E+ ^* X: T
; ^; z# D' I6 I; ^* X8 b* \
回到原程序.按几下F8,过了RETN我们就来到程序入口了. ( q: U4 q, ^$ e6 J; x1 \* c
005613DF 0000 ADD BYTE PTR DS:[EAX], AL & k p; d3 w' v0 O# I! C b
005613E1 0000 ADD BYTE PTR DS:[EAX], AL J. H5 C) f/ n0 u
005613E3 0000 ADD BYTE PTR DS:[EAX], AL ; v% H3 w# b; C9 s
005613E5 0000 ADD BYTE PTR DS:[EAX], AL
, [7 k* V1 J5 c$ w- M8 ^005613E7 0000 ADD BYTE PTR DS:[EAX], AL + u1 Y# T! ]2 d% c/ J2 e
005613E9 0000 ADD BYTE PTR DS:[EAX], AL
5 Y" k% b+ R( ?* C005613EB E8 4C5FEAFF CALL SystemCl.0040733C
& F' _3 h9 ^+ ^6 n, `8 z005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 6 Z0 n2 W) x! [1 M+ J* ~" w% l) `
005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 & e! T5 k$ \! N( q; C Z5 ~- a. b
005613FB 90 NOP # w" [3 b; s; v
程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 / n. i0 A4 D4 F! B: N
改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 1 J9 M% l9 q$ v& m, E4 h
是用D7写的,D7的代码特征是 + e$ g' F- s Z
PUSH EBP 7 i4 c' v* b0 R/ Y% J; [+ N K
MOV EBP,ESP 5 Y! `" i3 l* H5 F5 e5 l" A
ADD ESP -10(也可能是ADD ESP -0C)
) G) [, [) t+ D- {MOV EAX,****** 7 [; L- h# ]- r3 D7 R$ g/ J
所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 5 S6 j& d9 G! l- Q. s4 \6 B
005613E0 > $Content$nbsp; 55 PUSH EBP
# g7 M# N- a& g5 Z3 F6 O005613E1 . 8BEC MOV EBP, ESP - ^) w+ L! t- x$ \, e( T
005613E3 . 83C4 F0 ADD ESP, -10
# r/ F. Q6 s8 |& }: X& y005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 % C; d3 e$ }- q0 M$ w
005613EB . E8 4C5FEAFF CALL jjjj_.0040733C ! S c4 j1 {0 S
005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0
' g8 A" X% d2 @2 V7 i9 ^; L: H* n005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 8 G2 |/ l, B+ j- ?% _- b% y
保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成.
! U. a0 b9 S9 H5 B0 k* @5 Q |