QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2285|回复: 0
打印 上一主题 下一主题

新版aspr脱壳方法(完全版)

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-6 09:50 |只看该作者 |正序浏览
|招呼Ta 关注Ta

作者:jwh51  来自:看雪论坛

+ G2 N0 i1 {( Q' f9 K

+ S9 m2 |) B, a9 ?, H( J 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. [$ \& H" z# Y/ J1 ]* \% T 用OD载入,BP IsDebuggerPresent,F9,停了下来: & G3 C3 h4 {0 ]& B4 K f$ G) I 77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] ! Y% o) e& d& t- h* F& V77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] 0 H" t0 m; ` e* J 77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] . D; L4 y+ T# ^# Z: S0 N* | 77E5274D C3 RETN 7 C* v7 v2 l0 _ A- X: [ ( K& r9 k9 [9 a% sF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, : ^1 F$ O* @+ y& d1 r- { 重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 ' u( @" ?/ t) N00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX x# e5 B3 K" F- S) a E 00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] r) t# C# h3 ^# y0 R 00C23D68 58 POP EAX ( ~% z$ Y3 ^ l8 ?* T7 R00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 + C3 M6 k9 t( L00C23D70 74 14 JE SHORT 00C23D86 0 A5 T0 M( ~$ B 00C23D72 6A 0C PUSH 0C # U8 B: S/ E5 c+ ^0 P00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC / o* v* p2 }. I- S, U+ a 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] % R/ K. k, K O; _9 L1 v% U 00C23D7C BA 04000000 MOV EDX, 4 , w# h/ z8 ~( t' M" q: } Y) b$ ` 00C23D81 E8 8ED2FFFF CALL 00C21014 4 d& P( L: e4 O5 S* v/ m 00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] " j0 S. Q/ T3 x4 X0 X00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] , f0 X$ E: v4 I( L0 ^5 m1 I0 ] 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] 0 ^" U8 e3 R8 ]. `5 w) S! R 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 - V1 y/ A# c8 c! I00C23D92 74 02 JE SHORT 00C23D96 ( m4 |$ ~/ e4 o, y. R! t00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 9 e& V: I, l$ K2 V, I' O% [ 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] + g) Q( A, l2 J% a8 \; q" M 00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] * J! X8 K5 X$ l8 C 00C23D9C C3 RETN - W5 i' _1 h& t6 M2 Z' O4 J) x 这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 3 ^' v: [: e9 R. b Address size section contains / q) w u1 X$ |+ F2 F00401000 00161000 code , ^ Q/ N0 m( Z/ [& | 在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 4 q. g6 J0 S6 G" r) t# W. i" `: h; O" E 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] + @+ s- N1 r- V8 |0040727E 8BC0 MOV EAX, EAX % g& d7 C& u, ~% X' R. I% R00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] " h2 b5 y: k: P( x/ x 00407286 8BC0 MOV EAX, EAX 7 ^9 e9 q" j( M# T/ u' a# Y; G 00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] # Z, I9 ~( R7 d/ D0040728E 8BC0 MOV EAX, EAX * l, r! d8 e1 a; V 00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] 3 r9 ^, t% S( D, f; f 00407296 8BC0 MOV EAX, EAX 9 ]# Y9 q! N2 @) p 00407298 50 PUSH EAX & F: g. q1 a* t' v00407299 6A 40 PUSH 40 " n7 h0 a! V6 W0 A6 W 0040729B E8 E0FFFFFF CALL SystemCl.00407280 9 `' ^8 L" N5 n9 m: A 004072A0 C3 RETN 4 E( M+ [8 O0 | _. |, E) M 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: : A t1 d1 S; a 0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 $ g( ?# e* z7 D, w% I 00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 5 Y7 V1 x3 \7 c6 L! h00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX * l# Y+ g* j! k0 X0040735C 33C0 XOR EAX, EAX % m L& y1 ]$ E! R3 k$ B# E 0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX + P- z' j( z5 P1 r y+ `. [6 e 00407363 33C0 XOR EAX, EAX 3 j* l+ e U8 L8 H! o00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX " ?# i2 B# f9 O4 u& m9 @0040736A E8 C1FFFFFF CALL SystemCl.00407330 ! v3 ?& l7 \0 ?1 I9 m& @! n. Z: }9 Z0040736F BA D4205600 MOV EDX, SystemCl.005620D4 8 c1 l6 i" E" T00407374 8BC3 MOV EAX, EBX 8 ?3 G/ {, ?+ _/ b; H+ E2 E00407376 E8 75D8FFFF CALL SystemCl.00404BF0 4 w' ~ D0 Y7 a; R 0040737B 5B POP EBX 7 ~6 T: _# Q9 q$ z# i* q: w/ L 0040737C C3 RETN . A# }/ K) ^8 r( J 到这里我们要做3件事: ; }# Q4 B; Y. x1 S3 X' _1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 7 {( w1 |- O* x+ D* p& d# K 2,记下EBX的值560d08. : D w+ ]5 A# P 3,先修复好引入表,修复方法如下: " C* D' F* K- E( Y% t7 b 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, t& C+ k B/ R+ n v 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ( E/ D* D& k/ Q/ |) F! r下面就是修复入口处了. $ `. h# e) u/ m3 u7 u9 s0 H& a( i& X+ Q8 F 回到原程序.按几下F8,过了RETN我们就来到程序入口了. 5 z' v$ h* p/ P- q( R005613DF 0000 ADD BYTE PTR DS:[EAX], AL . w0 k$ ]& E& d) x) i9 B005613E1 0000 ADD BYTE PTR DS:[EAX], AL / S5 }+ W+ @) D( A& w0 O. j2 p 005613E3 0000 ADD BYTE PTR DS:[EAX], AL - ]0 B2 m# U) c. Z005613E5 0000 ADD BYTE PTR DS:[EAX], AL 3 P6 L4 H& f0 d! F3 `; k. `005613E7 0000 ADD BYTE PTR DS:[EAX], AL `% V* m" J) F6 ^8 l \" m005613E9 0000 ADD BYTE PTR DS:[EAX], AL 1 B1 r% m& J# c7 t3 Q s: V* _005613EB E8 4C5FEAFF CALL SystemCl.0040733C 1 @$ c3 t! r4 }+ Q+ ^5 f @ 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 8 k. P+ U/ |$ c7 r ]' ?005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 2 @9 {% V; r+ v. s0 Y ~ 005613FB 90 NOP 5 u- r, ], y) | O) S: x, x2 n 程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 + A: _, {+ ?9 q+ T* E& e改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 H. t5 h; E5 p: t( n 是用D7写的,D7的代码特征是 3 E0 L* a% ]$ R! v. x% ^8 u PUSH EBP b/ Q) x$ v l( `1 KMOV EBP,ESP / J2 \" f& @8 b& g% g2 f4 t7 bADD ESP -10(也可能是ADD ESP -0C) # f7 C: i% `3 S- I2 z; ]MOV EAX,****** - t% b; f R( w; c: h; L9 | 所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 - j3 H; \1 O4 P( |3 [5 y3 i# b/ M 005613E0 > $Content$nbsp; 55 PUSH EBP # a9 B9 R& ]8 @0 I: Y005613E1 . 8BEC MOV EBP, ESP / W" G# `) W1 s, \8 w 005613E3 . 83C4 F0 ADD ESP, -10 ( u/ V& d# H' ]& v# ?2 k9 K, s005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 * C- v- N9 Y, d" _3 l7 E' {' @ 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C }8 A2 l! Y+ ]/ ~: P1 H005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 ' g$ W3 b/ O; j' u* h005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 6 R* \: \# f- ^. M, B( i 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 5 Y6 V. z9 R* ]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-11 19:28 , Processed in 0.363187 second(s), 52 queries .

回顶部