|
作者:jwh51 来自:看雪论坛 3 h- C' ^0 k H6 L% `: z
* _" Y0 C' |/ m3 ]0 i
新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. * m( Z5 n2 J6 c, `7 g
用OD载入,BP IsDebuggerPresent,F9,停了下来:
* R6 ]: E5 E* t" h77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] ( Q9 f( j* i, ?) G
77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] 2 E5 u8 _4 R J' F" K
77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] : Q; [. x K# f5 d9 ]3 p: a
77E5274D C3 RETN % L9 [7 r3 K: J0 m2 [
+ y) f6 {; O2 O4 z% N; P7 a% SF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01,
# |, D6 i# U x( S2 G* A重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 + T4 Y4 F( Y# L X
00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX
8 T+ [# j/ V1 @# N4 Y00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0]
/ X6 [" {- n8 T# z( n00C23D68 58 POP EAX 2 q* M. _/ q- X& ^7 K0 A( A
00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0
& a% F; ]. y, F7 z00C23D70 74 14 JE SHORT 00C23D86
: B% r, {- C, d$ U) o5 t00C23D72 6A 0C PUSH 0C 1 y: Y: ] D0 u- b( W8 |# u; N5 `9 k
00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC
# n) S I7 k5 N! c. K4 E00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8]
5 q2 z4 ~3 j9 N0 W: p) M6 V00C23D7C BA 04000000 MOV EDX, 4
3 m4 L; j' ?' k% ] m5 \( S. a00C23D81 E8 8ED2FFFF CALL 00C21014 6 Z! `4 Y( @$ _" G7 F/ q) X
00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] * P2 o9 A# ^8 r9 ^
00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] / o3 ^$ X7 w5 K& v! c# b
00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
7 V% U7 w+ w2 _3 \00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0
9 _1 j/ J& [% p( R' M& v9 V! _+ X) v00C23D92 74 02 JE SHORT 00C23D96 4 y9 P8 _# }% K u. X8 U, I( c0 p( l+ R
00C23D94 FF30 PUSH DWORD PTR DS:[EAX] ! y) J" r) u5 K7 B( v
00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ! `. k1 X$ C, u* ^2 e) A
00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ) y A$ ^, ~! F4 c
00C23D9C C3 RETN
) ` w/ K* c, K/ h这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下.
) y) z$ t2 g, @" `- u* \Address size section contains " ~' b+ o9 X- R
00401000 00161000 code . v% O- G R& n- y8 I
在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 7 n7 |% `) K; p5 G% B
00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C]
: z( |, F: M( B0040727E 8BC0 MOV EAX, EAX
" }& P; I; k+ g' G# ^00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] & S( Q" S; j, r2 }
00407286 8BC0 MOV EAX, EAX
" G) W3 G# f" s* {00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324]
! [+ D* F; s! K {0 g& ?3 g) |% k, U0040728E 8BC0 MOV EAX, EAX
A. ^; [# k% m# h; V00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] , _) @/ ^: B; j
00407296 8BC0 MOV EAX, EAX ! I+ U1 g# l) _ E& ]/ h
00407298 50 PUSH EAX
$ J% a; P4 n3 [! ?% V- s+ a00407299 6A 40 PUSH 40
# s! s* s8 R i: x, R1 w0040729B E8 E0FFFFFF CALL SystemCl.00407280 / k6 {0 D3 Q$ E0 A" {- V. N
004072A0 C3 RETN
9 P) t2 c/ ]! V$ p. X这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: ( B m. i4 I1 \' A8 ?7 X% {+ M2 z* |% H
0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000
2 v& @) O' c# v8 Q00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668]
6 X1 D' [6 ^( y% q' z8 U00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX
1 n2 z* W' I, K- x% o0 S3 u6 X0040735C 33C0 XOR EAX, EAX
$ }$ P7 i. M. f1 b7 K x5 e0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX
# `9 [6 X% A* ?. L, u: B00407363 33C0 XOR EAX, EAX " ^6 B! b+ ]: }3 u$ F
00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX
& t' i+ d+ V9 C% {0040736A E8 C1FFFFFF CALL SystemCl.00407330
$ K5 a0 K2 j8 F7 W: z5 C$ n2 h0040736F BA D4205600 MOV EDX, SystemCl.005620D4 / h# n0 n" I8 x! I8 x1 _& k+ ^
00407374 8BC3 MOV EAX, EBX
) H0 O0 t- ?& R; r0 q00407376 E8 75D8FFFF CALL SystemCl.00404BF0 7 _5 g- d. H; u b
0040737B 5B POP EBX
6 ?) U/ p" B4 n: u, r; C y8 T0040737C C3 RETN 6 Q, g7 s) T9 d0 ^! K
到这里我们要做3件事: 8 v) W6 T, A+ y! E f8 s
1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. ; Z$ w& P6 a4 ^% @0 A! a6 z; s: ]
2,记下EBX的值560d08. . s, U' b# r. e7 [, S; t) P
3,先修复好引入表,修复方法如下: ' a6 r: ?" m1 E, E
看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988,
8 R2 G( r, \/ A0 H& G( A# U0 `打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. 4 j y* R% R+ B/ `
下面就是修复入口处了. ; }! r/ {; E$ k
# J- ^/ Y& D& X" l7 I _. f回到原程序.按几下F8,过了RETN我们就来到程序入口了. $ c% l# Q8 `) w- ?4 K4 L; M
005613DF 0000 ADD BYTE PTR DS:[EAX], AL 8 \- e1 _9 c, p! ^9 D- z! P9 ~
005613E1 0000 ADD BYTE PTR DS:[EAX], AL
7 v& d+ }- K5 g005613E3 0000 ADD BYTE PTR DS:[EAX], AL
% ?( b: C! i; L" V8 I005613E5 0000 ADD BYTE PTR DS:[EAX], AL a. K9 w/ i$ z1 N% [" r% \' J
005613E7 0000 ADD BYTE PTR DS:[EAX], AL ) p9 V1 i8 ]; Y i
005613E9 0000 ADD BYTE PTR DS:[EAX], AL
: B! m7 e/ K o' i% B/ B: ^6 l005613EB E8 4C5FEAFF CALL SystemCl.0040733C 6 N. ]/ A5 a8 s- a' c' q
005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0
$ x% i# {, N" p2 R8 O& j. d# E005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 0 p1 C& |: O3 c2 g; o3 o2 k
005613FB 90 NOP 8 r# x# _- [6 w9 {8 i6 n: X
程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 ! U. J% {' f# t! j
改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 % e. B! S8 `& \1 J1 D
是用D7写的,D7的代码特征是 9 X2 j5 x0 X: ?2 V$ M, a4 Y
PUSH EBP 6 Q+ L7 U' T1 q
MOV EBP,ESP
- o3 X! ?1 k9 N5 |0 k% CADD ESP -10(也可能是ADD ESP -0C)
' o; f" V3 w3 a4 uMOV EAX,****** : I `. f( O7 c$ ?; [
所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 % T& Y( \- i: X& P1 |8 W) T R
005613E0 > $Content$nbsp; 55 PUSH EBP 7 N" B6 g3 U6 h
005613E1 . 8BEC MOV EBP, ESP
+ r+ Z9 n" \5 F; z005613E3 . 83C4 F0 ADD ESP, -10 : z' j. n% w* z$ N! \ `* o0 L
005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08
" O6 }9 C1 J2 s* T8 Z q005613EB . E8 4C5FEAFF CALL jjjj_.0040733C 4 n% V5 Q/ e7 ~* k* w/ Q
005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0
* h4 J0 |8 B* b$ j9 u005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8
! b/ s K. n1 l: S: b9 A保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 2 Y# W) g: z# L1 v' e" `' K N, y
|