数学建模社区-数学中国

标题: 新版aspr脱壳方法(完全版) [打印本页]

作者: 韩冰    时间: 2004-10-6 09:50
标题: 新版aspr脱壳方法(完全版)

作者:jwh51  来自:看雪论坛

4 d7 v T- M% V \0 p: G3 A) V

: u; p( B7 z5 z新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. 8 m& u& }4 s8 x' s用OD载入,BP IsDebuggerPresent,F9,停了下来: 7 E/ |+ }/ ^4 c% H+ R I& x 77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] ; s7 e4 V( P( H; n/ M) G 77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] 9 n! J# Y. k: l, @ 77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] ( ~. C6 O4 T8 F) t4 Y' A 77E5274D C3 RETN ( `; _! d: X( s, T$ z& |+ B6 K" I+ Q. z& Z( c F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, 3 ` _7 s5 O# W7 m) M" d重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 ( h9 k4 v7 c! f+ {) \2 g; N; W00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX ' M: G p+ H! |# ]3 n! G7 a2 H+ B 00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] 1 _; k( E! X9 W# ~8 M9 k2 W9 S k00C23D68 58 POP EAX $ q, d6 ?& i: S# L' p: q) O- u 00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 - ~; u; o: G" W1 ~0 E) s( I 00C23D70 74 14 JE SHORT 00C23D86 . t$ D# w. I: |* U ]# M00C23D72 6A 0C PUSH 0C 1 N7 ~ B9 Q% T6 j7 P. ]) D3 o8 O9 } 00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC $ j6 l6 ?2 Y3 D 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] $ S/ G. g+ I' X4 P7 F6 L: W9 [+ F00C23D7C BA 04000000 MOV EDX, 4 ) N. i+ ` L6 Y& }" M00C23D81 E8 8ED2FFFF CALL 00C21014 2 {9 b- {' q; ?- F* B00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] 9 ^# a( C: h! k9 K; Y+ g00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] # L/ D' n$ k' d" L0 u/ F00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] 3 ^4 G) o, H2 V1 ~7 y% _: Y 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 ) R- P, P. ]% d' {2 [/ ]7 O* }00C23D92 74 02 JE SHORT 00C23D96 : |$ G6 B- K5 c% g. f9 t00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 6 I" r+ }& r9 S. Z9 Q/ o1 H6 x4 L 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] + m* _7 R+ V% R2 x00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ( z8 p1 e' P7 p 00C23D9C C3 RETN & G9 A; t7 Z7 D- x8 J6 C 这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. + R: W& m, U* r) H. J5 {7 X9 \Address size section contains ) ]3 u) f5 ^' l5 O 00401000 00161000 code 6 C* L5 m" ]8 n# U! [$ |, E. v在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 7 C' m e' ?* `/ V0 p 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] ; F; Z) v3 N) U0 j" a. g0040727E 8BC0 MOV EAX, EAX , k( L+ h! f& ^" D9 U 00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] / L+ F1 C) {, \; n7 g* T1 S 00407286 8BC0 MOV EAX, EAX $ i0 y$ z' V( Q+ b" T: Z, N8 T 00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] 9 V0 m/ e9 u# v- ~% g: G' i5 d 0040728E 8BC0 MOV EAX, EAX . g# _ g3 d! ~( z) v00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] # @% V" j& T, b/ x, Q( E 00407296 8BC0 MOV EAX, EAX 5 w b7 v# U! ? 00407298 50 PUSH EAX ' M' m5 q! e0 z$ b( E 00407299 6A 40 PUSH 40 # Z& T5 s1 {! }3 M0040729B E8 E0FFFFFF CALL SystemCl.00407280 ! m v/ l0 _ S3 t* \6 a ` 004072A0 C3 RETN 4 v+ k9 @" f" s# [' p& N 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: 9 v$ Q6 V% f6 R5 |0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 ( ~# b. [- Y- m) `) u5 z1 c, i+ f, f7 p00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 3 s8 n7 M7 C! ~+ X0 {% ]$ m' ~ 00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX : R# f' `" t# Q x5 l* l 0040735C 33C0 XOR EAX, EAX 9 l# @$ i- d+ m6 F) M) s A ?9 { 0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX # y5 I1 N0 h6 v. }# ~2 ~" H 00407363 33C0 XOR EAX, EAX 4 g% [' {" I% I, M00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX 0 C h: H: m6 E5 ?1 Q2 i0 L 0040736A E8 C1FFFFFF CALL SystemCl.00407330 9 L2 ~# U" d1 l9 X/ k: J$ U 0040736F BA D4205600 MOV EDX, SystemCl.005620D4 : W0 I# e* ^2 q3 b. p6 |6 r) d00407374 8BC3 MOV EAX, EBX " |6 h* r+ O- J( F 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 8 M9 k) f$ l) m* V 0040737B 5B POP EBX 2 P! a$ ?" Y4 y1 R/ }0040737C C3 RETN ; B+ @. ^/ o! `! M 到这里我们要做3件事: . w, v* e W& \$ Z; _7 c% K 1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. + N- y, N' n1 |3 ]0 E2,记下EBX的值560d08. , \- t7 G/ Z2 {% [ 3,先修复好引入表,修复方法如下: $ I8 b! O T2 Q0 Q* ?' z/ e2 T4 e+ o) Z 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, # L4 T: V$ U% F! C, M 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ; x, h6 `; b: y+ e9 x; s 下面就是修复入口处了. 4 C( e) m! v7 C: i7 {' d E- C , }+ `: K3 j) T- ^/ M回到原程序.按几下F8,过了RETN我们就来到程序入口了. - Y( n/ R X; G) B 005613DF 0000 ADD BYTE PTR DS:[EAX], AL 2 O# d. A6 ]. P3 V& r( E/ s0 K, U/ v 005613E1 0000 ADD BYTE PTR DS:[EAX], AL " P- e! t7 k. J" U# L' w( Y 005613E3 0000 ADD BYTE PTR DS:[EAX], AL 3 L) m3 r3 a& {9 Z4 k/ o# w! ~8 W 005613E5 0000 ADD BYTE PTR DS:[EAX], AL 7 O3 B, ^) m/ y3 w005613E7 0000 ADD BYTE PTR DS:[EAX], AL 3 j. J6 r8 y9 o$ y2 t# V! K 005613E9 0000 ADD BYTE PTR DS:[EAX], AL 7 t, T. C0 F# d' Q( _6 [4 T/ l2 y 005613EB E8 4C5FEAFF CALL SystemCl.0040733C , z( A/ J. N& h7 A. N y# \ 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 / u- d' Q: {2 w 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 4 A- B3 i% Z( C* b0 e1 @5 \- F 005613FB 90 NOP L+ {# ^# W, d5 C0 ^& f" m6 f/ I$ ]( x 程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 " g5 T! h& f v7 u3 }7 [+ B 改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 # Z* M6 f# c" c& t; B 是用D7写的,D7的代码特征是 2 B; t9 k$ \; ~8 ]+ t5 }3 lPUSH EBP . t5 E+ P% n7 N) i5 uMOV EBP,ESP ; ^: ~. b, h2 t% T7 U XADD ESP -10(也可能是ADD ESP -0C) 6 I5 A5 J( Y: X" X# _ J MOV EAX,****** ! U, N O$ x3 q w. ]+ q& G所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 7 x* b, U$ k$ ^2 k) C 005613E0 > $Content$nbsp; 55 PUSH EBP " u% `: V- c* Z. G8 j- {! n8 Y 005613E1 . 8BEC MOV EBP, ESP ' Y* D; g, n. q, m1 { 005613E3 . 83C4 F0 ADD ESP, -10 ! Y# p$ j: U- O4 b" d# r& j1 H" M; p005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 ! D, @" t8 ]/ w3 Y4 c( s4 O ?* C4 { 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C + u. \7 j% x- F U 005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 * {: \- I! l# a# l 005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 ) R# y4 t3 [" { P3 t! i保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 3 e) M6 M7 g `& Z# a6 U( K" d






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5