|
作者:jwh51 来自:看雪论坛 " m0 T9 @, q2 V
/ b& ]; l+ n0 g新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案.
8 ^/ @* @" K( u! t( t用OD载入,BP IsDebuggerPresent,F9,停了下来:
2 C1 |$ f d; \; j; Z+ U! q$ B77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18]
2 T z5 l' j& s+ v: P5 e0 J77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30]
2 d3 i# L" c/ D) ~4 V: c77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] 2 U* ?0 h1 Y* |/ N- E/ s
77E5274D C3 RETN
/ C/ T8 B6 y0 M" @! B8 B/ O5 y% F3 w% @9 l
F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, / q0 E0 s3 e1 [: f5 p
重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码
7 [& W/ ~1 h3 V00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX
# J; o& Y4 P1 P00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0]
6 f* \5 e5 h2 _2 h# H00C23D68 58 POP EAX # h- v" Z- Z* ?9 V4 }1 T& ?
00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 0 b9 U! M0 c0 E/ b
00C23D70 74 14 JE SHORT 00C23D86
; i. A+ {0 y5 N# P00C23D72 6A 0C PUSH 0C
8 b* ?/ f' p) n5 A% y% B0 f00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC $ D4 E3 K3 q9 N( l) i$ h
00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] $ f2 |( X7 \1 v
00C23D7C BA 04000000 MOV EDX, 4 / _4 h% v9 O) r6 z# Q0 N
00C23D81 E8 8ED2FFFF CALL 00C21014
* @1 v r/ |) H* k00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4]
8 R* z3 }8 ]; N% z; I00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
. `7 o6 b& x- j3 p6 V- }1 g$ H00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ! ]! H% H6 e8 e
00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 + p5 R& A4 d2 e
00C23D92 74 02 JE SHORT 00C23D96 . B" L+ T; d9 J! W: [
00C23D94 FF30 PUSH DWORD PTR DS:[EAX] % y" b- R" R, Q9 {. K
00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
* t$ O/ i q! R; K. x" ]( _0 `00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] 2 ?. T5 k1 f" _ j0 e
00C23D9C C3 RETN 1 E) y% v2 A4 F/ H
这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下.
. C9 f$ J! K$ ^2 l1 BAddress size section contains
' p) v& |0 b* \ a3 `00401000 00161000 code
) P# T4 T; T9 o. @* @& i5 n5 L在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这:
3 u/ c' d, a! F. H: w$ t. c00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C]
% W6 D) X5 V9 Q4 S( f0040727E 8BC0 MOV EAX, EAX
* T" W( Y1 C& q r: p3 h6 H& B00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] 7 V8 ] j2 I {( n: y* |6 r' H6 c
00407286 8BC0 MOV EAX, EAX
/ [8 A0 |+ z( @& k00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] ( N+ B7 L$ @8 U6 N# w* y# m
0040728E 8BC0 MOV EAX, EAX ( ?' {8 W/ o/ i) X$ u3 H. S& X
00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320]
. s' P( d7 m0 s% v( n4 ~" {8 O00407296 8BC0 MOV EAX, EAX 0 d2 u1 _ ~* N% u0 O' G
00407298 50 PUSH EAX # F" F, D8 p" ~+ o
00407299 6A 40 PUSH 40
* S+ q7 P0 p( ]2 Q+ D0040729B E8 E0FFFFFF CALL SystemCl.00407280
! g. [0 P1 ^- n4 G: G! T004072A0 C3 RETN , Q& ^9 [* J7 y9 ]: i7 z
这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这:
0 w" D3 |5 P8 T6 V! |; m* y. t- A0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000
$ b" i1 `# r% g0 z2 |00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668]
: E" a/ ]4 p5 [7 o9 V00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX
& I/ L. n# m! B, H: x0040735C 33C0 XOR EAX, EAX
/ U0 y& e, X" N8 e1 u/ Y0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX 1 Y6 M" w5 b" K( Q! Y% c
00407363 33C0 XOR EAX, EAX
* k5 n& R% V+ J4 p4 X# f0 j1 z4 C# X00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX & M) S+ H7 ~2 n6 c
0040736A E8 C1FFFFFF CALL SystemCl.00407330 ( }! ^9 [ D) B! x$ G
0040736F BA D4205600 MOV EDX, SystemCl.005620D4
; Y% z3 y) W' A7 Y0 D5 Q00407374 8BC3 MOV EAX, EBX f/ N! @3 c7 z! L
00407376 E8 75D8FFFF CALL SystemCl.00404BF0
( A! s6 l6 o. P3 Z/ H! w/ A0040737B 5B POP EBX 9 u0 |! H% S* s( I
0040737C C3 RETN
T1 s5 P( X- g! h5 S) u3 ~到这里我们要做3件事: " u4 e- ]; J1 d; S) ?
1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. ( v# [: q6 Q- f0 h; t( i# @! |
2,记下EBX的值560d08.
/ e0 w) s3 F- B' D e3,先修复好引入表,修复方法如下:
, \; t1 p* w! n1 j+ R看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988,
( c1 u; D) Y: l! ^3 Y# C, r打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ! ?$ J# i/ `+ g$ o) G- C7 o& M
下面就是修复入口处了.
+ }" F6 S" M1 d' y6 g6 W" A1 `1 V) P1 o' A) R/ B% g$ t' V% V! Q
回到原程序.按几下F8,过了RETN我们就来到程序入口了.
! l1 S5 n- R" C/ k" h005613DF 0000 ADD BYTE PTR DS:[EAX], AL 8 i2 J& K5 x2 o3 M# j% H
005613E1 0000 ADD BYTE PTR DS:[EAX], AL
% D9 a6 ^; K# O0 K( z3 O2 V3 L' Z2 y005613E3 0000 ADD BYTE PTR DS:[EAX], AL 9 Y) u4 f: B" e$ q
005613E5 0000 ADD BYTE PTR DS:[EAX], AL
# X$ [ }( o' }; J! T005613E7 0000 ADD BYTE PTR DS:[EAX], AL % u! p; r# x' p0 f7 n
005613E9 0000 ADD BYTE PTR DS:[EAX], AL ( s( c6 j: w5 S! d: \& Q1 H
005613EB E8 4C5FEAFF CALL SystemCl.0040733C ; C' \) y1 b0 G0 K6 R: v: s
005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 ' O4 ~- V7 y9 _3 t; J6 |8 J' P' H& u
005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 7 V, P- p: {0 Z$ x& V& m: O
005613FB 90 NOP
9 F' w" ^3 x, }+ x# a程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 8 k0 B1 T' u6 v& u9 @: t
改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 $ n8 D5 ^! M/ W
是用D7写的,D7的代码特征是
0 a$ u" F3 ~/ u9 ~4 YPUSH EBP . W, f1 `$ Z* @
MOV EBP,ESP ( Q' c5 l# |- @! K' h7 }+ y, Q9 B
ADD ESP -10(也可能是ADD ESP -0C)
& D) {) ~& P& }2 F+ m4 YMOV EAX,******
+ p: O7 A" m8 n# C1 z* h' @所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样
) R0 Y# ?( m# J005613E0 > $Content$nbsp; 55 PUSH EBP 1 U) J: n7 ]# g* `% H
005613E1 . 8BEC MOV EBP, ESP
# b5 E. Z) C. `" D+ E005613E3 . 83C4 F0 ADD ESP, -10 3 s' }+ f( J n2 b) a
005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08
3 |$ M: R+ D: F005613EB . E8 4C5FEAFF CALL jjjj_.0040733C " {. U4 ]4 l7 n! v' g* a
005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 6 j; v9 v8 c; A2 `( U, l+ y
005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 7 g, B5 }5 ]# ~& f, {" ?
保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. . _: N2 q5 C" Q c: H, ~5 g3 m6 j
|