|
作者:jwh51 来自:看雪论坛 . |7 O3 g/ s8 Z- t6 ~
7 @5 }' V% `. O新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案.
$ A: |' S7 p* Q1 N) ?' ?+ g7 X用OD载入,BP IsDebuggerPresent,F9,停了下来: " P: L3 z% V" s' U$ u; C
77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 0 @, I: C* M, R, ^
77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] * |+ j) E! n; X& Y- u, i7 X; X
77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] % Q ]% f# i0 F. Z. H5 L
77E5274D C3 RETN
0 t4 X# ^2 r/ s$ ~; ~; F, W, }" Y2 B# z. J$ q* R7 U
F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, $ E4 _7 F; b* v3 o, ?0 }
重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码
* v# D4 y$ W5 R8 [/ l% r# x n& H00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX
* j7 Y4 R' O$ L" ? p00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0]
! [6 P& m+ }5 @) i% z00C23D68 58 POP EAX 1 h# D- c; M, r" ^, p
00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 9 u# X/ P- I3 H& K5 q0 Z7 M
00C23D70 74 14 JE SHORT 00C23D86 5 n# j' x( c: o
00C23D72 6A 0C PUSH 0C 9 r B7 [ ]; _
00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC 8 r) L* C8 }( p( K& s& {/ J1 w! B
00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8]
9 \9 [# z6 F# T# a3 o7 `5 R00C23D7C BA 04000000 MOV EDX, 4
$ `4 _ O, @% U$ W+ S* z: y00C23D81 E8 8ED2FFFF CALL 00C21014
8 Q; F% E2 i8 e: t( Y. x* n. J00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] . G" s7 z7 E$ k4 S: \
00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] ( y( X9 X5 F$ W6 D
00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
% U/ q" }7 x- N+ o00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 . ^, i8 W3 F+ r& X" c9 R
00C23D92 74 02 JE SHORT 00C23D96
# n& ]8 O5 I% @& Y00C23D94 FF30 PUSH DWORD PTR DS:[EAX]
" K1 O- w3 m0 Z7 _00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] 6 o( ?8 C3 J- R" v% o6 ]
00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14]
; {/ i4 s3 G! e) G! `1 p00C23D9C C3 RETN s0 E8 e% @& M( X1 h
这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下.
6 x3 `( s, _+ l( oAddress size section contains % W9 c& W% o9 W- E" S0 ^
00401000 00161000 code
* k* s/ @7 p2 U1 q, _; Q1 D% d在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这:
& ^4 m! Z6 \- h$ [& \8 {5 B# X) \00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] ' W6 t1 k! C, M) X+ B" \& Z
0040727E 8BC0 MOV EAX, EAX " }' l( d( I( U5 a8 m" w
00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328]
) Z. `" C) K7 Z00407286 8BC0 MOV EAX, EAX
# p; Q. \' o2 D# m1 ~( u00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] , @& e0 V+ s) x, }; b( y
0040728E 8BC0 MOV EAX, EAX
+ q. W& y4 T) L/ i00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] 8 b5 w+ m4 j& R9 H: m
00407296 8BC0 MOV EAX, EAX
) Q' |& P* Z2 R9 t8 g6 U# L00407298 50 PUSH EAX 9 h0 i0 ]. N9 H: g E9 R8 D
00407299 6A 40 PUSH 40
$ I9 }8 L2 u w4 V, _# [9 `; l0 _0040729B E8 E0FFFFFF CALL SystemCl.00407280
4 t9 V$ Q' Z. y# i* E* N004072A0 C3 RETN
. \* e8 c& {; a0 b这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这:
$ O6 [- |2 k1 k1 m( r0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 5 b- z# M/ j) f u7 ~4 P0 G
00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 2 u9 X8 O: w! C$ i
00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX ( D' A3 b9 g- V! V8 \
0040735C 33C0 XOR EAX, EAX
& W' ~ F) @1 J K0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX
" ^7 H! s/ j: j4 U( B8 p5 Z00407363 33C0 XOR EAX, EAX + i% }5 p2 x% ]' Y5 x( e
00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX & ~. ?) T. S9 H8 Z# Q Q" p2 [
0040736A E8 C1FFFFFF CALL SystemCl.00407330
, }. A% J& G& P3 G. G5 y, E; j0040736F BA D4205600 MOV EDX, SystemCl.005620D4 / T# T& D; t5 R$ q5 t
00407374 8BC3 MOV EAX, EBX 1 \+ n. @; @& @$ g6 a$ R% f7 j
00407376 E8 75D8FFFF CALL SystemCl.00404BF0 - l: Q. T' s: N0 V8 r2 G% S
0040737B 5B POP EBX 6 M0 ?% [1 t$ D6 n8 V
0040737C C3 RETN 5 C- W% z% l* S, A2 U
到这里我们要做3件事:
6 Z: p8 j# v- r% n; t% @/ D1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE.
+ o/ [* T* i% @2 n7 A6 s( G3 B2,记下EBX的值560d08. / e2 c0 Y. Y8 a, _5 v
3,先修复好引入表,修复方法如下: 5 e7 s; e! N% X* [3 f1 B& x
看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, 5 L4 T# [8 `) `* C% b
打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. & _' D2 [9 z+ R1 K, M
下面就是修复入口处了. $ f; o) T/ v' \
- o+ T/ i* X0 h: M
回到原程序.按几下F8,过了RETN我们就来到程序入口了. % O& d0 }8 j, _ Z u5 H) ?+ m
005613DF 0000 ADD BYTE PTR DS:[EAX], AL
5 G4 C+ @! B2 E# G/ u# s005613E1 0000 ADD BYTE PTR DS:[EAX], AL 8 h( f, G% N2 R5 r
005613E3 0000 ADD BYTE PTR DS:[EAX], AL % I' g& F4 z' B6 l2 y( I
005613E5 0000 ADD BYTE PTR DS:[EAX], AL ! z9 L1 y: D- [$ ]
005613E7 0000 ADD BYTE PTR DS:[EAX], AL ' N# D" n2 r- N; F9 G
005613E9 0000 ADD BYTE PTR DS:[EAX], AL
2 f0 b/ `! y4 x: C6 I8 B' V005613EB E8 4C5FEAFF CALL SystemCl.0040733C 4 I# i0 ^9 ?1 o$ n6 k
005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 # ?: {, ~3 } e8 T. p
005613F6 E8 BD39EAFF CALL SystemCl.00404DB8
, F' X2 L% y" f4 b* O005613FB 90 NOP
/ D$ Y# W- K+ W; {9 _程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 & I/ C7 {8 n/ k" \ d
改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点
* O: r, `, p- k, j% ?6 w! ?5 n是用D7写的,D7的代码特征是 , y. H l7 W( N6 Q# _& h: K
PUSH EBP $ P8 n" J1 I% ^7 n
MOV EBP,ESP
, K* b3 ?7 f& o" m4 tADD ESP -10(也可能是ADD ESP -0C)
; f) V4 F- u6 u# NMOV EAX,******
& C, M& [" U& L h所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样
K9 G, \( j1 N) {005613E0 > $Content$nbsp; 55 PUSH EBP
0 X) q5 Z3 o; _ o. [ p2 [" m" v005613E1 . 8BEC MOV EBP, ESP
2 P4 r( a" B6 O005613E3 . 83C4 F0 ADD ESP, -10 4 _) t- t0 a" ~3 Z w: B% u
005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 ! r1 `. t: Y3 f, o8 v) v
005613EB . E8 4C5FEAFF CALL jjjj_.0040733C
9 e6 ]- T0 K8 s& P005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 1 x" ?/ _( g% q7 ?: B
005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 0 D. C2 j2 t% [9 ~
保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成.
" I7 f" A! z& |2 M" V+ W4 q |