|
作者:jwh51 来自:看雪论坛 - w% i5 q+ V/ v; _% d3 W9 h
4 ?* K# ^% S4 Z+ ]$ U( O新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案.
' w6 C( w# H% q' X7 T, e用OD载入,BP IsDebuggerPresent,F9,停了下来: - ~4 b4 ^; b' c5 y, J+ Y& @# p/ M7 b
77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] & x; \; o8 p! i* S! [
77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30]
4 V( Z. l) _3 }. x! b7 D, c77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2]
$ P! {! A* v( a, [' W/ C77E5274D C3 RETN 5 G+ {5 _$ y! q- m
* ]& X" \8 T W0 } zF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01,
, x: G: f/ Y: b+ o# k$ Q重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码
" J; s% N' Q4 q5 K, n9 d! Q00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 9 k+ i! y, _ M% O+ a0 ]5 }! t
00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0]
% u: Z/ @& g& T" U% K7 [9 L1 F00C23D68 58 POP EAX
! ? A; j, r2 l6 q9 ^4 s00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 ; ~( z: h! f4 D% O
00C23D70 74 14 JE SHORT 00C23D86
0 o V% O& a4 [- h9 f7 G: C* t00C23D72 6A 0C PUSH 0C ( N! @8 D/ k) Y; Z( E' h/ |
00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC # X' |/ {* f$ j9 A) T" b0 d4 z
00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] d% ~ t8 H) @: F9 G
00C23D7C BA 04000000 MOV EDX, 4
% G5 ?5 Q J: |6 a4 I! K9 `! H00C23D81 E8 8ED2FFFF CALL 00C21014 8 N4 B. I: H8 p' a1 Q5 ?# ?6 ?8 |
00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] ! t5 a( q6 e" s, u6 ^: k: p
00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] " R5 w; ?! Q% a) W& o
00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ; R. g+ J! k* h& E
00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0
$ |9 T N4 [# g. c. O8 j00C23D92 74 02 JE SHORT 00C23D96
9 s" u) d3 z9 _* x00C23D94 FF30 PUSH DWORD PTR DS:[EAX] , p5 i/ d- `! O8 f! [. s* j1 x
00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ) }: W- B5 s E4 j p+ B4 N
00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ! r A8 l5 l& e
00C23D9C C3 RETN
' N4 P; \; y1 p9 g; q, X这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下.
2 a3 h. N* `, Q# G. D: @" PAddress size section contains + ?8 D% c+ X8 |+ b6 G/ t* ^# N/ n/ e
00401000 00161000 code
- `. _ ~# Y' Q4 K1 ~ S在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: - z0 L6 [4 L6 G
00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] 8 l- n X( B3 e% u9 W, i
0040727E 8BC0 MOV EAX, EAX
/ i9 P9 _3 l, S F3 g: ]* s$ b00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] 3 [: u# r) K. J) a
00407286 8BC0 MOV EAX, EAX & \& P: }' v) d. S
00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] P, k- z! m: W0 z/ k- U
0040728E 8BC0 MOV EAX, EAX
( j% g" ~, C: B* Q; g0 f5 M00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320]
1 D! G; V1 u7 K* ?00407296 8BC0 MOV EAX, EAX
. @: [) U+ n: I$ {, Y4 `00407298 50 PUSH EAX / d6 k6 @7 u+ E/ ~0 d2 ^! ~
00407299 6A 40 PUSH 40
$ u* E. N3 E. w& t+ u' B0040729B E8 E0FFFFFF CALL SystemCl.00407280 : n; u/ N7 Y+ Z, y
004072A0 C3 RETN
% Y' P2 G6 L& d' d4 p这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: U' ?. _! ]0 N9 M. C
0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 9 R7 l7 B/ o: w) a; \0 J9 f5 u
00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668]
) K; t( n1 {' m$ g* k- [ s* A00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX * n5 e+ i# h5 M" Y: e
0040735C 33C0 XOR EAX, EAX
8 V6 k7 e; D4 U0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX
2 s0 n$ n$ N% r00407363 33C0 XOR EAX, EAX
3 V, [6 i- A, h/ q$ y! U00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX ; U1 E& @/ q7 s4 y1 l. f6 j% w' q7 }1 x
0040736A E8 C1FFFFFF CALL SystemCl.00407330
6 _' ?' z! X3 F4 M* h2 f" V4 U0040736F BA D4205600 MOV EDX, SystemCl.005620D4 2 s l4 d' u2 A9 P3 U2 G$ V: y) b
00407374 8BC3 MOV EAX, EBX
6 g' W- t4 a" |9 D% o4 J00407376 E8 75D8FFFF CALL SystemCl.00404BF0
0 }$ R: ]# f( w4 N Y% _0040737B 5B POP EBX
9 c* s' f Z+ W) n/ N& l( I0040737C C3 RETN
4 Q8 h, ^1 q2 Y( q; l' S* Q到这里我们要做3件事:
0 V! M" C) W: x7 x$ ?1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 0 L. N2 c0 E+ y* r$ b% x
2,记下EBX的值560d08.
( L' K, E9 g: X" [# y5 \3,先修复好引入表,修复方法如下:
# x6 ?6 }" `; Y看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988,
* ?/ z) E! Y( i4 `, K7 d$ M打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. , i6 C0 f F4 W9 Q8 u' ]
下面就是修复入口处了. 6 c. D# @4 d; Q m
% r( s- L# }) _0 U, u1 l+ G9 J6 |回到原程序.按几下F8,过了RETN我们就来到程序入口了.
6 b1 B g5 ]; s. q$ J6 v" g005613DF 0000 ADD BYTE PTR DS:[EAX], AL
: [7 K: i% O3 }005613E1 0000 ADD BYTE PTR DS:[EAX], AL
( P! f) D8 v# D7 u& I4 C005613E3 0000 ADD BYTE PTR DS:[EAX], AL
; k# s3 N# y1 h4 E( C' P7 b/ G% ]005613E5 0000 ADD BYTE PTR DS:[EAX], AL & Y) ?' M7 H- m' w7 y6 e
005613E7 0000 ADD BYTE PTR DS:[EAX], AL E9 c8 u( @7 g
005613E9 0000 ADD BYTE PTR DS:[EAX], AL ' F. n1 ]. M) Y' q8 K3 Q
005613EB E8 4C5FEAFF CALL SystemCl.0040733C 5 G7 h. E2 ]9 x7 c- R
005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 + y& z; D; i% F0 X, w' G
005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 " n9 x I4 M7 _# _7 P
005613FB 90 NOP
$ x( B" `$ T% T程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 ) y) @/ f H+ S9 V7 W# M
改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 8 i1 ]5 G% X2 j1 a% n* b' m. x
是用D7写的,D7的代码特征是
?( G0 I* I7 i, ^; X6 VPUSH EBP " {$ s- \3 s+ C9 z
MOV EBP,ESP % [: l7 g% P% e" G8 {5 K/ m9 ?! o! x8 i
ADD ESP -10(也可能是ADD ESP -0C) - Q$ B1 X, _; F' ~8 m& S
MOV EAX,******
! F0 o/ O* l3 |% [所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样
- _$ d2 u" V W3 Y005613E0 > $Content$nbsp; 55 PUSH EBP 4 n0 @# u4 a4 @ X+ E
005613E1 . 8BEC MOV EBP, ESP 2 n+ E9 m: D N1 i$ C" q8 b
005613E3 . 83C4 F0 ADD ESP, -10 5 A# i3 L" ^" i: y, n5 x0 c
005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 4 y1 M# S! J' l4 x& Q+ _- T* k
005613EB . E8 4C5FEAFF CALL jjjj_.0040733C / Y6 b/ J" T2 {" q% o' q
005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0
5 E' Q9 j$ G; q1 W2 `$ s005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 7 q" M& M c9 D1 O
保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成.
$ V: z g" |4 D$ K2 n% P* C |