|
作者:jwh51 来自:看雪论坛 : t0 _: P9 `& l! k/ a* C7 A
# o; J2 H6 S( H3 Y8 g
新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. , G/ q, Z/ R$ s2 y d8 `" o( g$ I
用OD载入,BP IsDebuggerPresent,F9,停了下来:
& i; C. d+ t2 s2 D7 ^1 i1 v77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] - Y, C- s4 w6 O5 Q+ B
77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30]
( P! a3 N- R+ `3 P77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] 3 N M8 C8 k% K+ I/ R$ e3 G
77E5274D C3 RETN
0 Y( ]) c2 }. N/ E. m n2 N, \3 M4 e: |' A; W
F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, ; \! P- x9 ?' L; n* `3 N7 R
重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 - w: `+ Z1 {, E% ]! Z5 M
00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX % l+ S. i' l4 |* g7 u" t5 @
00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0] $ o+ r6 g2 n- e/ |. o; C' s
00C23D68 58 POP EAX : [- ^; Q4 e; Z
00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0
% ~, ]6 W4 H# ?8 K# c ^4 K00C23D70 74 14 JE SHORT 00C23D86 2 u3 F2 N; p1 f0 f4 n: U) m% \$ V. \
00C23D72 6A 0C PUSH 0C
% L9 ?$ M& G2 g# x3 A9 Q& ?, a00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC
# J& \& V- p+ {5 Z00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 0 S5 t6 j+ N' u: Y$ q) c7 i
00C23D7C BA 04000000 MOV EDX, 4
5 i$ @5 C; P0 K+ T. E6 ^00C23D81 E8 8ED2FFFF CALL 00C21014
/ Z. n( |; H5 n$ d5 p8 q" ]! j. [0 j1 _00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4]
: w0 j# R; q: r/ d0 k+ M00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] & |- L9 d+ e( u+ ~( G* i3 h
00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
9 V6 w2 D, g5 ]! _# E00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0
4 M3 [# `/ p# G W$ E00C23D92 74 02 JE SHORT 00C23D96
# w' T3 p" X% R. _9 ]3 `, Y3 Z- }& ^00C23D94 FF30 PUSH DWORD PTR DS:[EAX]
5 y7 s" Q/ |6 M00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
# N" U3 g7 x, j; `- l00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14]
0 [! e8 U7 p; F- T" X$ V" f8 C) W/ |5 ^00C23D9C C3 RETN
- f6 x* E/ w, j+ s- M D: ?这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 8 C0 b* C$ f# \& N- R+ v q
Address size section contains : I+ ]8 f; q9 Q4 w8 E: v% ~. T3 p
00401000 00161000 code
# z- G8 \* j6 C/ B1 [% T5 @& T在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: - X% z2 p( y) X
00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] % _& _- h; B7 {5 I" S" G5 l
0040727E 8BC0 MOV EAX, EAX
+ B8 m" k) y! B B$ i" @* ?00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328]
% Y0 G1 s+ h& e, F! \: V1 g9 ^3 a00407286 8BC0 MOV EAX, EAX 8 a9 n, x7 a+ t
00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] 8 X) y% Y9 D# U ~9 N
0040728E 8BC0 MOV EAX, EAX ( Y0 J4 X; g! |3 b/ a5 K
00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320]
# M1 T. r& I6 q% p00407296 8BC0 MOV EAX, EAX
* J' `1 B* i6 ?9 y+ |8 l0 H- `5 w00407298 50 PUSH EAX
6 S; B* @4 z) @/ Q( R! T3 m( r00407299 6A 40 PUSH 40
0 t8 D" q* F7 { E0040729B E8 E0FFFFFF CALL SystemCl.00407280
7 }+ o5 E5 w, `! W004072A0 C3 RETN
6 s# }7 A: |' ~这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: H" a$ q; O9 I* p+ S
0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 % J' A- X" M; X2 q) s( U& k
00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 7 K T% O! j1 x" I* G* U' w
00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX
, B+ y9 e# G, n! K% s6 K0040735C 33C0 XOR EAX, EAX 1 d; R T/ Z( w1 V q
0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX
- z, y$ {0 X4 V/ J( i00407363 33C0 XOR EAX, EAX : A" L2 `( c! Q: r
00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX . R8 ~, s3 q' f
0040736A E8 C1FFFFFF CALL SystemCl.00407330
8 d' |$ y1 U* v" h# d+ M+ \1 J0040736F BA D4205600 MOV EDX, SystemCl.005620D4 % o+ d4 }5 @* }2 Q
00407374 8BC3 MOV EAX, EBX
$ c; o+ ?+ Y F. B: ^6 q# _% G00407376 E8 75D8FFFF CALL SystemCl.00404BF0 - s7 A! Q+ h' q& H
0040737B 5B POP EBX : I3 f/ M0 E9 C/ [1 m1 T% p
0040737C C3 RETN + v# ^0 }6 Q8 e* o( K
到这里我们要做3件事:
* Z# c3 Y. C) E0 J1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 6 z' ?( {+ ~9 S, M4 q
2,记下EBX的值560d08. 2 @: C" l1 Q1 q' ?6 L5 e9 R0 l
3,先修复好引入表,修复方法如下:
5 i# ?4 t1 ]5 @3 \! ] n1 g看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, 0 j+ x* F1 S& k* q1 D* z: G
打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ' k9 k3 P B" [- L5 d
下面就是修复入口处了. 1 S6 S2 z! n( O/ W# Q
7 R5 P r$ h. y! {: ^ M/ @6 Z" C
回到原程序.按几下F8,过了RETN我们就来到程序入口了.
4 Z( ~1 O: B# M2 E; j9 F005613DF 0000 ADD BYTE PTR DS:[EAX], AL
: D" U$ P. v5 r: q" ?5 b. U005613E1 0000 ADD BYTE PTR DS:[EAX], AL
/ a$ i( E* t9 E; y( }005613E3 0000 ADD BYTE PTR DS:[EAX], AL
3 A+ y& |0 y2 Z005613E5 0000 ADD BYTE PTR DS:[EAX], AL
/ L: `0 B, X6 u, ^2 {005613E7 0000 ADD BYTE PTR DS:[EAX], AL
m- T" s8 N0 H: U; K9 @ A! B005613E9 0000 ADD BYTE PTR DS:[EAX], AL
* U; k/ |; R9 N005613EB E8 4C5FEAFF CALL SystemCl.0040733C ' V) r1 Q% ]' i5 a, H. o7 O+ f
005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0
$ u" e9 M1 B) \005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 ' R4 j, A( @- |6 |/ e/ u, a
005613FB 90 NOP
& F0 h- D$ i# @, d程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被
, ?% k% t$ b; Y, u$ N改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点
& S" U% V, ?0 h是用D7写的,D7的代码特征是
4 ?7 G- p! N8 a0 u" NPUSH EBP / q) B& V9 ]! L% I8 O: t; s
MOV EBP,ESP 8 C; T T1 A/ J& p$ q
ADD ESP -10(也可能是ADD ESP -0C) 1 }1 e2 f5 U U+ V
MOV EAX,****** 4 S0 H) x) E+ m& \' c! g" g; M
所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样
" v6 r" D, U6 l005613E0 > $Content$nbsp; 55 PUSH EBP
8 m2 _3 A& M3 i/ O005613E1 . 8BEC MOV EBP, ESP
) i/ W8 k7 p2 J1 _6 [005613E3 . 83C4 F0 ADD ESP, -10
# {# f s. R+ I005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08
2 ?) T+ |* ^4 }! N) ~005613EB . E8 4C5FEAFF CALL jjjj_.0040733C
; X4 J# |) W5 L$ [* C* T005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 , U* V9 a& y' H+ V6 \& B; `
005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8
/ O, B- w& ~& T8 S保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成.
6 f2 M7 w7 l% ? |