|
作者:jwh51 来自:看雪论坛 0 l' `* I" ^" K' e8 c# \
3 I9 C& y) z z7 t, s
新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案.
|0 y; T! Z8 y% t( F4 j0 \用OD载入,BP IsDebuggerPresent,F9,停了下来: ) Z: X4 N, S1 O/ F0 {6 n) p3 S0 `
77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18]
8 a8 F( \1 ~& p" T# U: V% |8 b77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] + C' j: e" T) B8 m$ i
77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2]
+ m/ }+ _& Z7 e! i- ]- I77E5274D C3 RETN . q3 ?' ~+ ?& i( U
, U4 p4 @2 [6 OF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01,
+ y; G- r% j. v0 u% |) n! _重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 0 c# x3 N0 a$ [9 K1 h) B
00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX
5 |- ~: a5 l3 x9 A+ V: H+ V00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0]
# T* O8 c6 E2 b' H5 Q7 Y2 z00C23D68 58 POP EAX
* M1 T# s: j$ m; s/ g00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 , w( L) f* I. p0 ~
00C23D70 74 14 JE SHORT 00C23D86
' d( a( R# r6 p9 o/ C. V00C23D72 6A 0C PUSH 0C
6 c5 a) [( {' n' t& }4 s00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC
; i' \" ~( ~$ j# Y7 }* u! a00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 8 Z6 B3 c1 y n- t
00C23D7C BA 04000000 MOV EDX, 4
4 j. Y/ g6 x$ b1 o" C0 q2 f00C23D81 E8 8ED2FFFF CALL 00C21014 " G1 b a- M# R# K3 K' e8 L$ z/ t; L
00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] R' ~. ~6 ]6 g" K! S
00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] C+ y4 y) p* ]- \
00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ' Q- u. S9 W" @; O
00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0
8 d$ E' X }0 {! V00C23D92 74 02 JE SHORT 00C23D96
7 ^7 O; l) }$ o& J( H# e& i00C23D94 FF30 PUSH DWORD PTR DS:[EAX] & K5 J* C) N5 [: q2 U, i
00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
% ?* t3 ~! ~0 l2 c) y00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ! l9 i5 o- B% X) b
00C23D9C C3 RETN # n# [$ @& F# f: E2 l. v, o
这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 6 i" B: @% `3 e
Address size section contains
9 Y! y; z- ~7 y" y00401000 00161000 code
* O& h; E' K8 E. |$ D" M4 M在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这:
: S5 c5 b+ O+ h, M8 v D. w) q00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C]
( U" F T" C& k/ x3 _0040727E 8BC0 MOV EAX, EAX
6 p; p0 h: n# [6 e00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328]
- j- h+ R. J; N00407286 8BC0 MOV EAX, EAX . b/ y; d. Z' ? U0 {( }: L
00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324]
. a7 H; E1 N9 W5 F# w6 Q. A) D( I0040728E 8BC0 MOV EAX, EAX
" Q I/ H5 J, ^3 g$ v00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] " I$ w* { L& D1 k- {
00407296 8BC0 MOV EAX, EAX * I, i3 R$ u$ E$ p2 w o1 L
00407298 50 PUSH EAX
3 L, u8 K8 n A% W X00407299 6A 40 PUSH 40
0 Y6 L$ ~. ?- l+ g Z' W2 d2 B0040729B E8 E0FFFFFF CALL SystemCl.00407280
. J1 b& m: { \, O7 y004072A0 C3 RETN 7 [0 _( F, V: y3 U. g% c$ D+ n1 M4 r
这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这:
% v6 C% I! G7 j, E4 V# W0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000
) `( [, J/ L/ ^00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] ( r6 D5 }1 I" |+ y3 [( R" @6 R' C$ x
00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX 1 |9 V4 _+ n; M- G4 O! C) T
0040735C 33C0 XOR EAX, EAX
: Y; S, D5 ?% ^0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX
. |4 R: O& q9 o0 n+ p00407363 33C0 XOR EAX, EAX
1 I+ }( N% @& t/ S3 R" F0 M00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX
- l1 r) w$ n) V# m0040736A E8 C1FFFFFF CALL SystemCl.00407330 5 H, D0 x0 }5 s7 I$ y; l$ A
0040736F BA D4205600 MOV EDX, SystemCl.005620D4
5 F2 T1 m- t! V/ |: C3 D! |& z00407374 8BC3 MOV EAX, EBX $ g/ T8 k# ]+ d3 R2 r. ?
00407376 E8 75D8FFFF CALL SystemCl.00404BF0
# |4 _* W4 r- t0 p& g0040737B 5B POP EBX 1 i; Z* V. k' K, C3 \
0040737C C3 RETN ; C4 f7 A1 Z+ S
到这里我们要做3件事:
3 z" V" r8 H! S0 j: X1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 4 ]( @2 K, H7 J% I
2,记下EBX的值560d08. " t( r% r- f# V- O3 P: p" K* ?
3,先修复好引入表,修复方法如下:
0 M. z/ p5 h% x5 Y" B6 Q% P& q% V/ q看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, , e1 n& ~1 x1 M7 v8 ^, ` ? S
打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE.
) X. n7 R4 ?' A9 ~, E- {. T8 B0 X+ j下面就是修复入口处了. ' Q0 v6 W0 F9 n- q# r2 w6 S
7 e" m0 E4 w! c回到原程序.按几下F8,过了RETN我们就来到程序入口了.
/ i. C! [. Z$ ?% L" H+ a4 X, B005613DF 0000 ADD BYTE PTR DS:[EAX], AL : x2 O9 C! I0 g: Q; i* B! ]/ S
005613E1 0000 ADD BYTE PTR DS:[EAX], AL 1 S# G/ S3 D8 {" ~: b
005613E3 0000 ADD BYTE PTR DS:[EAX], AL * {( `6 x4 {6 h
005613E5 0000 ADD BYTE PTR DS:[EAX], AL
9 p( I( C1 S$ S7 k4 L005613E7 0000 ADD BYTE PTR DS:[EAX], AL & `( m4 F! j4 p* C1 k
005613E9 0000 ADD BYTE PTR DS:[EAX], AL : ^( G7 k' `4 J. z
005613EB E8 4C5FEAFF CALL SystemCl.0040733C
# e& p) u1 u/ ~# H# _% u0 L- Q005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0
) Z2 Y% l0 P( }: x4 O* L \2 `005613F6 E8 BD39EAFF CALL SystemCl.00404DB8
' x9 M5 }2 a: C$ K005613FB 90 NOP - ] Z1 E) @8 X3 R5 i
程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被
8 h3 J0 J4 w1 z+ d+ L改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点
) }5 \. j+ G) R( e是用D7写的,D7的代码特征是 + O) }, A# l2 |2 p# [! R' r
PUSH EBP
9 T* z: D$ N/ U: s( WMOV EBP,ESP
! I8 z% ^; w- c% Z! f0 kADD ESP -10(也可能是ADD ESP -0C)
# r; I# }. \1 t" S# KMOV EAX,****** 1 h( t; `3 J, _
所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样
' S- M. ` m6 x* r, l005613E0 > $Content$nbsp; 55 PUSH EBP ; }# t, O2 B' c
005613E1 . 8BEC MOV EBP, ESP
* {) y& \6 i" v+ V" {005613E3 . 83C4 F0 ADD ESP, -10 ' q% k' O, R/ M; c7 `: J
005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 , C" Y! \8 A) w" i8 P8 y
005613EB . E8 4C5FEAFF CALL jjjj_.0040733C
3 y+ E$ x/ b# b2 a- ~( {005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0
7 k \" ?1 j# z( d) m005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8
, {$ J+ Y w$ w' F保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 2 ~3 @$ e2 K* W& v' z, c
|