数学建模社区-数学中国

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

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

作者:jwh51  来自:看雪论坛

4 G+ Q0 C) g5 i

/ R4 E* R' i6 g! W3 A) o 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. ( N, Q. I0 b P 用OD载入,BP IsDebuggerPresent,F9,停了下来: 8 s9 w; }. L* i# a, t' U+ |* Z9 S77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] ) w) ^* P% K' X( {6 r! q! @. }77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] ( u; m" f1 X( H% Y7 P& w$ @6 z 77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] & N- Q8 Z2 G9 K! a) n$ v% v! T 77E5274D C3 RETN " L$ u' p$ d# q% [ L& G B 5 O3 Z2 b0 o) A. W9 F% uF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, 3 i8 j u: l& ^) [ b9 W7 z重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 ; L; F. L& o% a+ W& l, r00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX ' a: \$ N6 p( K$ A. e 00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] ( {5 K* X* n$ b# d& _& v00C23D68 58 POP EAX / V3 \4 q( Y3 ^" j00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 2 z% c4 ~0 o8 ?2 L 00C23D70 74 14 JE SHORT 00C23D86 ' S6 a3 I5 H) n0 W5 n. W. S 00C23D72 6A 0C PUSH 0C 6 S ]) t5 P$ k0 [- k00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC 9 J* v" P: } b% D- x, d r 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] # N$ f1 t* S" S. {. v2 r2 k1 c, Z 00C23D7C BA 04000000 MOV EDX, 4 6 }2 J1 w' z/ l' w; @( a/ w00C23D81 E8 8ED2FFFF CALL 00C21014 4 x( L' V1 M/ P5 L 00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] . w! `+ }6 y- L ~& `1 N00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] 4 q$ X( C9 d" \( ]00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] N7 Z- d) \4 Q- Q 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 # a. Q! i3 m0 q8 x1 n, t 00C23D92 74 02 JE SHORT 00C23D96 / u$ r" R% K# y% L7 S8 i: I; J00C23D94 FF30 PUSH DWORD PTR DS:[EAX] / r$ ^" d5 U( t" S4 F 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] " U5 R# P* l' _2 c, Q! L 00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] * v$ L! M" |/ p5 C6 p 00C23D9C C3 RETN , b" Z+ b! U- p 这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. $ Z+ |' }2 V5 t$ o7 ?! B Address size section contains # `8 {- ]& ~: j00401000 00161000 code E% p$ z1 \+ v- f6 w1 r在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: % C0 y2 h: Y5 ]5 |( e5 Y00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] . v" y4 _# |/ ^$ W( i 0040727E 8BC0 MOV EAX, EAX 3 A2 I' `( S% V1 @ B" k$ S( d/ J 00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] G6 t8 O; [/ d9 o; N( D( z00407286 8BC0 MOV EAX, EAX + e! y4 O- J* p \% b0 I5 s00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] 1 k# H# f/ O9 R$ h# a2 e 0040728E 8BC0 MOV EAX, EAX 5 J. m& L: f9 O; u$ M o+ q 00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] 2 Q1 Z! {/ L* I# k% m' D00407296 8BC0 MOV EAX, EAX 3 o' K# H" v7 l8 a/ U: {* L00407298 50 PUSH EAX / `/ E& Z8 x- F3 v; i 00407299 6A 40 PUSH 40 ) `0 n3 i8 Y j1 P0040729B E8 E0FFFFFF CALL SystemCl.00407280 + ^& u, F' f9 P5 L* {5 c% S6 O004072A0 C3 RETN 8 U P7 l; \/ @) ^ 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: ; l9 A, w! K- Q( k- B4 Q0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 0 \8 F* r% m: m) T7 M3 b 00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] / E, J& c/ ]+ f. x9 \ 00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX * c) a6 z7 f) H0 C0040735C 33C0 XOR EAX, EAX N6 v9 I, @# B0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX % D- S# z" K% z- [ 00407363 33C0 XOR EAX, EAX + Z/ L1 v0 n. U4 n" B 00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX * G$ r* h: e {6 b- \8 |* [ 0040736A E8 C1FFFFFF CALL SystemCl.00407330 + {1 `3 z; x# M% w* l4 u2 P 0040736F BA D4205600 MOV EDX, SystemCl.005620D4 5 l" C) U3 m: B- m: s00407374 8BC3 MOV EAX, EBX 3 w- F+ B/ R- _* J5 j00407376 E8 75D8FFFF CALL SystemCl.00404BF0 9 A' X! G1 H2 N. s3 ?% Z* y" ] 0040737B 5B POP EBX 3 d' J) m6 X% `) g8 a5 Z! b 0040737C C3 RETN : j& t! S8 g' b0 ?# w到这里我们要做3件事: 5 t0 l& d$ w; X7 J% @1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 4 x0 b& t# {- R8 c: V. q) [; ] 2,记下EBX的值560d08. # L4 X- F$ W7 F8 y4 l3,先修复好引入表,修复方法如下: 9 V( [+ `* ~; V! O( S2 X+ o4 |& f 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, # t2 v/ x4 B5 c1 L8 x打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. 2 ^ _! r7 t. C' U: T& d8 [2 I$ k 下面就是修复入口处了. 0 |6 o0 x! y3 G) [* E; P 6 t2 s5 W: J/ e u+ i 回到原程序.按几下F8,过了RETN我们就来到程序入口了. - \# f* ~$ }: d+ W 005613DF 0000 ADD BYTE PTR DS:[EAX], AL 6 ~: w, I+ f' q0 `* p5 h8 L3 L 005613E1 0000 ADD BYTE PTR DS:[EAX], AL $ f, `( f5 z; c; Q& h5 ]0 C' [005613E3 0000 ADD BYTE PTR DS:[EAX], AL ' k. E6 L* Y6 o! Y/ n 005613E5 0000 ADD BYTE PTR DS:[EAX], AL H( ?5 A( |# F8 M$ S: M005613E7 0000 ADD BYTE PTR DS:[EAX], AL 0 j9 {9 A; a$ I7 k 005613E9 0000 ADD BYTE PTR DS:[EAX], AL 8 L6 G5 x' k$ O5 o005613EB E8 4C5FEAFF CALL SystemCl.0040733C 0 [- z# M% _' \7 H 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 r- J, z2 F7 ?8 e 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 ' ~2 y3 Z4 v) V' P2 u9 A b005613FB 90 NOP # M. n& b: c& v* r N程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 2 N U8 T1 `8 y& ?' y Z2 x改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 ( E1 G1 A4 V5 H, ~; W是用D7写的,D7的代码特征是 , V9 |7 D- w4 u PUSH EBP ; I2 }, v4 M- l: g: M7 @MOV EBP,ESP ( V9 A! V; f* u4 v9 M! v ADD ESP -10(也可能是ADD ESP -0C) - ?$ x) ~1 V* t; G5 C) G MOV EAX,****** ' J! z* Q. ~: @5 N$ j0 |所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 8 n+ h. U, C4 X- c005613E0 > $Content$nbsp; 55 PUSH EBP / O/ J! E- K9 ?: p 005613E1 . 8BEC MOV EBP, ESP : Y4 ~2 Q) \$ I" p 005613E3 . 83C4 F0 ADD ESP, -10 / ]4 `- G9 l6 l 005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 $ ]0 g' t8 G l3 Z 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C + {! {$ L2 Q4 j- s! t: x& m005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 5 o, M8 @* f" w$ s. K6 { 005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 / C& Q5 Q8 _( S2 O4 Y 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. ' [. f) \4 |+ A9 A. K2 s: O- K






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