|
作者:jwh51 来自:看雪论坛
5 \. s% P, x9 z/ `+ r& g: Z
! k* R0 [( t+ t9 J新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. 1 q0 O; m H: ?. `
用OD载入,BP IsDebuggerPresent,F9,停了下来:
4 O9 k" ]- x3 }/ t77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 9 g7 o" o1 C" K
77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] ; u' f0 g I8 ~$ l
77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2]
5 L* w1 u/ f" l6 x, K8 A77E5274D C3 RETN % h* h- F7 q3 Y% _4 w( D: a K
7 g- K% V" ~4 u1 @( F/ s {
F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, 4 _: G, J1 \. R, Y5 K5 q
重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 + z* r* P. `. k% I
00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX S- |* x* }( ]3 |1 q" T; r
00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0]
4 I5 L2 I" [$ L* r% j+ M00C23D68 58 POP EAX
& ^1 @8 B5 A9 q1 T1 e00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 / D) a/ n4 C9 Y* Q- k& C) m
00C23D70 74 14 JE SHORT 00C23D86
$ q$ O: |% v0 X$ a F00C23D72 6A 0C PUSH 0C 5 n/ w2 J0 @' @8 O
00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC 6 o4 {1 g4 L1 V9 P1 @3 E
00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] % k' \& `; \4 d+ H+ ]$ Z# X% Z
00C23D7C BA 04000000 MOV EDX, 4 " G1 B+ K5 A: `7 k: f! G, L6 [* K
00C23D81 E8 8ED2FFFF CALL 00C21014 6 o/ {# ]5 Y. C1 G _$ @2 B
00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] , a. m5 c! c# N2 f
00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
, s0 @7 c' J6 m1 D4 t00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
a0 C- U# I' P1 k$ L" I) V00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 " G0 G$ t+ J5 N; d. j7 A: m
00C23D92 74 02 JE SHORT 00C23D96 0 O& n& l2 R9 Q/ X
00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 9 S" ?% P3 f6 t- q% x4 j$ Q
00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ! _5 J0 s# D w9 ~& f7 Y
00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] & @/ |( c; g: {( \( v& n0 X
00C23D9C C3 RETN 2 C- Z8 z; j- x. T0 t( u6 P
这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. " q. d7 o# _/ _; t3 T5 g
Address size section contains ( O) Z+ t G; l# @3 s
00401000 00161000 code
3 a0 B: B! q p. ]* v, T在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这:
' B4 M8 l/ c8 @8 Y. S& N P00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C]
0 B; E$ z) \" [4 C2 i# }0040727E 8BC0 MOV EAX, EAX
3 r. t' A% A) ^; c- u00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328]
/ e) l+ U& b( ]5 C5 V00407286 8BC0 MOV EAX, EAX + r, B5 R7 n( A. G# V D
00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] 6 `8 ^4 D/ N0 Z) \* u# T* m |1 |* o
0040728E 8BC0 MOV EAX, EAX
4 O& Z4 h3 y* ~00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] . w# e) f* o$ h( g* y4 e
00407296 8BC0 MOV EAX, EAX & v7 H2 x" Z, d* x6 Y, _% U5 y
00407298 50 PUSH EAX
; z7 Y# X1 @! N3 M. t# ~( l7 S& n$ O00407299 6A 40 PUSH 40 4 F# O" `& d4 @. @ V
0040729B E8 E0FFFFFF CALL SystemCl.00407280 : u+ C8 {2 {& S1 ^3 [" M. U
004072A0 C3 RETN 4 }2 K4 d) K0 V' |5 V6 z
这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: / V! a: T+ R% g
0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 : m# B d5 |2 t+ ~9 D! ?
00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668]
3 t0 V2 y, v) b00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX
% R) n, a) d6 s0040735C 33C0 XOR EAX, EAX
' a4 a* ]2 o; z7 X5 _" M0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX
; ^& l. x" w2 ], t0 Z2 R00407363 33C0 XOR EAX, EAX / ~; d5 L" v+ z! i0 @" ~$ h/ i
00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX * X8 |, U( ~7 M( j/ K p+ O
0040736A E8 C1FFFFFF CALL SystemCl.00407330 6 Y$ H) U, ]! z6 K6 i
0040736F BA D4205600 MOV EDX, SystemCl.005620D4 2 s/ s# a+ B) g \* \: ?# @3 `
00407374 8BC3 MOV EAX, EBX
& O" [' n" R& e# _) W# V- }' x0 t00407376 E8 75D8FFFF CALL SystemCl.00404BF0
' A% m1 m) O3 j- O% i0040737B 5B POP EBX . ]# U9 P) h$ B
0040737C C3 RETN , s1 r6 ~: x5 ^& L& q
到这里我们要做3件事: % v7 n5 n' \' J# f
1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 6 g; I$ X0 ]0 N( n! a
2,记下EBX的值560d08. ; _. H; G/ H8 ~7 y/ L* z" x
3,先修复好引入表,修复方法如下:
: m( @: y. `9 n/ F' a* P看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, " Q8 }0 ^; W) \/ P9 { S6 M3 i
打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE.
y/ h5 i7 x$ A/ @# C下面就是修复入口处了.
/ F; H) @" s2 u) R# R
7 X) V: U/ }! Y. x* f7 O' S回到原程序.按几下F8,过了RETN我们就来到程序入口了.
9 ~- K r$ x Q- C5 m% o( P+ _005613DF 0000 ADD BYTE PTR DS:[EAX], AL 0 y7 s1 o( R5 V- S
005613E1 0000 ADD BYTE PTR DS:[EAX], AL
. @( v6 W: M6 W m' P7 Z3 ~005613E3 0000 ADD BYTE PTR DS:[EAX], AL 6 C2 z- X" |3 q& s: [
005613E5 0000 ADD BYTE PTR DS:[EAX], AL
3 Z7 U% t( }' _1 s9 `) Z6 s2 ?005613E7 0000 ADD BYTE PTR DS:[EAX], AL ' ?9 I. g* W( I) e5 Y7 m
005613E9 0000 ADD BYTE PTR DS:[EAX], AL
5 E2 l, V! T: H- [5 d) t; m005613EB E8 4C5FEAFF CALL SystemCl.0040733C 4 c, _6 j G% Z" o6 F4 g! g7 I0 I
005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 " u7 Z/ `# b! z( z: h4 E, f
005613F6 E8 BD39EAFF CALL SystemCl.00404DB8
% W" ~0 v) i! q" Q7 Y005613FB 90 NOP
! H& {+ l! }* x5 |* @% O程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被
( |$ x. j; Q+ y8 |# F! W. N/ l改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 / N' C. j1 O3 H1 L+ ]7 {
是用D7写的,D7的代码特征是
7 N4 K+ F/ T1 _/ c& T2 @' qPUSH EBP / x0 y1 R- K( ^1 {, V0 ^
MOV EBP,ESP , V" t# ? _. A
ADD ESP -10(也可能是ADD ESP -0C) " U* P9 w# }9 ]8 Z: @3 e I
MOV EAX,****** ) l% l! Q E }0 p/ Z6 v) n
所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样
* F' W1 U, R/ C" D' d$ |3 P: z7 ^005613E0 > $Content$nbsp; 55 PUSH EBP
) o" V4 T: C: F7 U6 u005613E1 . 8BEC MOV EBP, ESP * M1 k0 L- o8 m* q/ l0 m: C" _6 ]
005613E3 . 83C4 F0 ADD ESP, -10
|2 c1 b# k+ h005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 5 j9 X& Z3 B. B' L ]( u/ {# U
005613EB . E8 4C5FEAFF CALL jjjj_.0040733C ! X, i- G* n9 K( U Y4 r) ?% u$ f
005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 , i+ W: _' s: G$ o z; o* c
005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8
4 m K( ~- \) o2 ?# [保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成.
9 ^% {# ^5 S) ?5 v }) c |