数学建模社区-数学中国

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

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

作者:jwh51  来自:看雪论坛

* J' ~8 i9 a C3 s |

* U' g: N5 F. O1 O+ q 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. + V9 }+ v+ J8 R- r j! z) {用OD载入,BP IsDebuggerPresent,F9,停了下来: 3 L, E: T$ O( W2 ?: m+ \! v: c 77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] ; y5 p# m: @ H77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] 1 p9 K/ ~, `) k2 B+ F$ i4 O 77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] ! o$ } i; w( z" ~5 `& E77E5274D C3 RETN & L' F: ]; X8 o& ?" W' h ' \. j) G! @( i: }4 X: g4 m; [F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, % I; @- F# |9 n; \3 H 重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 * L0 F$ Y' j& k R2 C& c0 ^6 F00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 4 g! |+ q6 u7 {8 L! `0 y4 ?00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] , E+ G) X& V" s' O3 Z7 v; U00C23D68 58 POP EAX ; h) J6 v2 b+ L) \* C9 U00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 L1 v' K* Q7 w00C23D70 74 14 JE SHORT 00C23D86 ) ? W% S) ^' R$ y$ n& N- q00C23D72 6A 0C PUSH 0C ; f1 J# ]3 w1 C: z00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC # e6 S$ J+ f% A2 v 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 3 `% d" W4 a- v0 o8 X00C23D7C BA 04000000 MOV EDX, 4 : h; e1 I4 U5 | 00C23D81 E8 8ED2FFFF CALL 00C21014 1 j7 ~2 }# q# k6 L2 e1 z/ m 00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] 6 Y% n3 _, s9 A) z00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] ( z4 i2 S# q9 @; c" a1 ~ 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] % j5 W# S" h5 X0 l& V: m 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 ) l+ L; T2 B+ C; U* C* ~00C23D92 74 02 JE SHORT 00C23D96 ( |2 l* \; l: F2 H! z00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 6 i* P9 M) Z, e$ e! n 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] $ W0 G; |1 T8 H$ K3 d00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ! C$ r$ m: m! v" M0 h! R 00C23D9C C3 RETN 7 z% b$ _- d6 O a+ f这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. * }' ?# d! e7 B; R+ y* I Address size section contains ! L4 H( N: k. d$ M: w9 u0 w00401000 00161000 code $ n7 b' e$ U6 s$ F0 ^在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 1 C0 e: U! r! ?00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] ! m! ]$ q1 b9 b7 w" S: [7 ? 0040727E 8BC0 MOV EAX, EAX # W: f& p7 r* M% I, y$ |00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] ; a* _% U! H/ s5 _2 s 00407286 8BC0 MOV EAX, EAX ! |5 y. A4 _% C" o0 Y" f- f" \00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] $ w8 E7 P8 p4 Q$ J 0040728E 8BC0 MOV EAX, EAX 5 [1 f; L& d3 n# s00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] D; y. A4 v" Y% Q. Y( o 00407296 8BC0 MOV EAX, EAX & J. Y% p3 a5 Q8 ?/ A00407298 50 PUSH EAX 3 c: I/ o8 V. y0 J3 ^00407299 6A 40 PUSH 40 0 c- C& H) H! c; Y# I0040729B E8 E0FFFFFF CALL SystemCl.00407280 2 S; G G* X& `$ F" e) P6 ~% q* i 004072A0 C3 RETN $ T8 {* |9 G. j. Z% f p5 M8 P 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: 8 V; j; ~% P( I6 P: F 0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 $ `( [% I: ]+ A0 l" i. Z 00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 3 e6 [+ e% z5 b 00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX ; Y4 M$ v$ i. K5 Q4 ~ 0040735C 33C0 XOR EAX, EAX : M- n; X! L, g, r( M2 c2 s, [; L0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX l5 s# W( x' r5 y% i 00407363 33C0 XOR EAX, EAX ( z& U1 N# F5 f+ R1 w( o00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX - }6 ^, G3 p' C% Z. a0 {! O0040736A E8 C1FFFFFF CALL SystemCl.00407330 B/ x2 S$ v1 w0040736F BA D4205600 MOV EDX, SystemCl.005620D4 0 C* C6 \ C5 i" n$ C' Z2 C00407374 8BC3 MOV EAX, EBX 9 F; w) `% o/ a& a8 H; v6 l* j00407376 E8 75D8FFFF CALL SystemCl.00404BF0 5 e. X, O* x) G5 n T1 M0040737B 5B POP EBX - W4 C% }; a* }9 M# G: i0 V3 t 0040737C C3 RETN ( t! I5 N0 j: h6 ~) I 到这里我们要做3件事: ; M3 B. C5 Q% z. W1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 6 a1 g. n4 _! F2,记下EBX的值560d08. 5 Q! @! y3 o; }6 L% X1 U- r 3,先修复好引入表,修复方法如下: * }2 e5 E: W# g0 i看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, 1 R" p. K, Z" @, o: j' a" B. ? 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. 6 N! L0 h* `% D1 d+ j9 b 下面就是修复入口处了. ; s) ~3 C: p" F' `, ] " U5 J) U8 ?6 Z' X回到原程序.按几下F8,过了RETN我们就来到程序入口了. 8 p3 B$ x8 x; i6 }2 z0 H 005613DF 0000 ADD BYTE PTR DS:[EAX], AL 1 ^# C K+ n; M7 l, {4 N: h; m* @005613E1 0000 ADD BYTE PTR DS:[EAX], AL 4 W" M, S* R* J7 I- E005613E3 0000 ADD BYTE PTR DS:[EAX], AL 7 z+ w. U2 T ^/ o4 Y 005613E5 0000 ADD BYTE PTR DS:[EAX], AL 6 T5 F2 P: r2 g 005613E7 0000 ADD BYTE PTR DS:[EAX], AL - h5 e5 h6 _ j4 x1 M3 y2 I005613E9 0000 ADD BYTE PTR DS:[EAX], AL 7 e# ]4 ]9 D1 S Q' M5 F9 r% V 005613EB E8 4C5FEAFF CALL SystemCl.0040733C # h6 d& f+ v; ?( G0 L% S/ U! a 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 " d6 n( K/ Y! z5 m6 d) e" L, J 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 / y' C: u j; g0 }2 B" D005613FB 90 NOP ; Z6 L1 R& N1 F% K7 L程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 # [, z* T+ {4 ]" A( v1 C 改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 ' g' @ H5 k0 g$ T是用D7写的,D7的代码特征是 ; j+ y% {' J& \8 X' Z) c' ^. | PUSH EBP % h* g" r. @& Z8 l5 | MOV EBP,ESP 1 [- N3 o7 g* ~+ U N' B( z7 I6 a& { ADD ESP -10(也可能是ADD ESP -0C) * a) Z9 k& }: J( G MOV EAX,****** : g8 t" @% I1 ?5 `2 s 所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 * K1 s) x! g' T% n7 M 005613E0 > $Content$nbsp; 55 PUSH EBP " Q* C4 Z; T6 J* O( P 005613E1 . 8BEC MOV EBP, ESP W8 s' ^6 C' @0 y9 i* j, \005613E3 . 83C4 F0 ADD ESP, -10 1 Q/ H- E2 i0 p0 j8 i( I! f; Z( u+ i005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 0 f+ H8 R' U& p3 f 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C ; D' o" A; t" z6 |+ p. U2 P9 K 005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 8 R2 A: p& a% e005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 4 \- [: }8 W3 z7 D& I保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. % V/ O; m+ C" b) P1 x; Y






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