QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

1 @- _# P+ K; x* ^' Z1 E% K5 f, N

3 t0 f S' q& x2 K 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. $ d. U* [3 K F+ H' X1 H6 C 用OD载入,BP IsDebuggerPresent,F9,停了下来: 9 T! H6 X; N5 j% a2 A77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] # d$ e3 c* U: B# G- n5 J77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] 7 N( Q# u* o- p) T! k! v v77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] 1 Z. C" ?/ \/ g9 u4 o77E5274D C3 RETN ) }7 ?4 j! l1 ~4 X8 R) D7 C/ _, w- p F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, " U1 x# }" O: u" ^% c. w4 K! Q重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 ) B9 B: U8 o6 B+ B" g# p 00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX # _3 _1 J, t. d9 T5 }00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] + F8 y4 t# o6 }& d% F, h: R* u00C23D68 58 POP EAX - z0 A( o) Q7 Y. y+ P7 ]. Z00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 $ [$ V9 r; |3 l0 _( {6 T 00C23D70 74 14 JE SHORT 00C23D86 / J0 S1 i& A: D( p% m 00C23D72 6A 0C PUSH 0C ' d! q8 i3 [ s' m8 p9 K& l00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC # z5 b: `6 W0 M: H: M 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] " M/ [( a2 @& N$ e" ~. p00C23D7C BA 04000000 MOV EDX, 4 0 v t( N* o# h 00C23D81 E8 8ED2FFFF CALL 00C21014 ; o# p6 h, N6 Z! P# _00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] 2 c$ d+ d0 B8 D" U* V3 F- x* A0 X5 g 00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] 7 ]1 g% r# A& b00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] * F. [0 D! P& P- K5 e5 a 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 6 t2 ?( T8 }2 J! X a3 r" Q00C23D92 74 02 JE SHORT 00C23D96 % l5 ^1 k7 j- B: P& |' @5 }6 x 00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 5 F. |1 x3 H% t; n" q) e5 L00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] . b, X: N( s; h+ ?- b, @( m/ @ 00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] 2 h' G: Z# b+ T& t; z( W# E2 W 00C23D9C C3 RETN 0 i0 o8 J5 r, X( y8 S这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 1 `: h9 z) e! V, v0 b" F Address size section contains * G* {9 s" t- e 00401000 00161000 code / T- T; N) M. Y0 s6 @% P 在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: ; k a3 z3 ]$ V+ ^" j7 P 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] " O! S7 @3 Z$ p1 a8 `$ y: |" n 0040727E 8BC0 MOV EAX, EAX / e, _, a7 b$ Y% q3 Q 00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] , I. `6 x/ }7 v4 m7 B0 @ 00407286 8BC0 MOV EAX, EAX & K5 T2 Y7 X& A [00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] / Y' P8 t2 e0 S& N! i# a R0040728E 8BC0 MOV EAX, EAX 9 X# K' h; j ~$ S6 N00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] : X( Z" S8 {" _% z00407296 8BC0 MOV EAX, EAX 1 z1 n% }4 l: o2 |4 D, C00407298 50 PUSH EAX ; [, B; ~; C/ X( g' W' P7 v00407299 6A 40 PUSH 40 + _# h8 o$ B7 k3 B% v 0040729B E8 E0FFFFFF CALL SystemCl.00407280 / e g& G' c3 ^. a& I. X- c- H004072A0 C3 RETN % d( \4 d5 `, T% V 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: $ ]0 @9 z% y2 q; u0 K! o* Z 0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 $ K" J( H! t4 d: w$ T00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] ( ^9 t0 T# @/ |8 _ `7 g$ ~# k00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX 8 C7 w& k- n5 U l) n6 C" T0040735C 33C0 XOR EAX, EAX + Y9 J2 x8 |9 w' `0 l4 J 0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX ! ?& n0 O+ ]$ `# T2 F 00407363 33C0 XOR EAX, EAX 5 D% r2 r( U( s00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX - H) [. \! k# `, P- N0040736A E8 C1FFFFFF CALL SystemCl.00407330 % K6 Q P5 F* G/ q, Y8 a/ G/ k$ C+ S8 C0040736F BA D4205600 MOV EDX, SystemCl.005620D4 % z+ y& c5 h0 w- f' c- _1 M9 L 00407374 8BC3 MOV EAX, EBX Y9 u, M1 Z8 F& P: z5 a 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 4 U# _) [4 R0 v0040737B 5B POP EBX : [8 |8 ]6 F, U; T0040737C C3 RETN + \7 U: h% Z) u& _% P" |6 D到这里我们要做3件事: 6 p& [' P/ [( g' |( u0 x$ h1 ? 1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. % h. m; Q' v" b* t( N& H 2,记下EBX的值560d08. # A+ Q. R' ]: `* r% t# J3,先修复好引入表,修复方法如下: & C' S) Y' T( b0 d1 j: O K 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, # J2 J/ V" G7 L- w h 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ) ?* d) c; D% E# ~0 j下面就是修复入口处了. - g1 d6 |4 d* \+ l) h9 ?: \ 1 }0 Y+ p; ?& s$ E 回到原程序.按几下F8,过了RETN我们就来到程序入口了. : L6 Q+ N+ @# ~% Y; Q E005613DF 0000 ADD BYTE PTR DS:[EAX], AL 7 ^1 | m3 B |8 ?% `005613E1 0000 ADD BYTE PTR DS:[EAX], AL 4 G( f" Q5 j3 h0 B 005613E3 0000 ADD BYTE PTR DS:[EAX], AL ( w: ^; c% ^" e 005613E5 0000 ADD BYTE PTR DS:[EAX], AL - l: d* Y% I% R' O/ A3 o+ {/ H005613E7 0000 ADD BYTE PTR DS:[EAX], AL 7 ?9 {3 L, B- i! }+ Z005613E9 0000 ADD BYTE PTR DS:[EAX], AL , Z9 v* N8 o- V* F& M* w 005613EB E8 4C5FEAFF CALL SystemCl.0040733C ( X- c! D+ ` L( G" [005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 $ s6 \ P1 h# H; ?005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 0 q" j+ Z: h0 Y- W005613FB 90 NOP 0 _8 |, e0 g) H, K5 t/ K5 W* t 程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 , X* m9 I( x% b" ^# L8 [& v 改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 7 e1 v" v" v4 z" i4 t; Q 是用D7写的,D7的代码特征是 0 ]7 B& f; ^! f! e# |2 N1 o# }- }9 ?; hPUSH EBP , t( ]; o+ \" [7 x( y$ n% D MOV EBP,ESP . r, h& Z! K3 Z& g P, f. | ADD ESP -10(也可能是ADD ESP -0C) 8 e V& N9 k7 B- h* mMOV EAX,****** + B( H" B7 b) H2 i* d6 c所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 - ^2 }+ k: X; t3 A) R" n 005613E0 > $Content$nbsp; 55 PUSH EBP 6 }% o1 d1 b0 x) u005613E1 . 8BEC MOV EBP, ESP 5 J* {5 j2 p! `005613E3 . 83C4 F0 ADD ESP, -10 $ e0 Y' _/ W( m& K, V# m6 ~005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 ' d k S' ^( t- Z y/ Q4 D! g5 P# C005613EB . E8 4C5FEAFF CALL jjjj_.0040733C ) d8 s+ |5 c/ E! X; E005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 ! p! }6 \( b1 }. F005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 8 a+ A! ~7 ~' D, r+ T 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. % x0 v* P; `7 |$ ~/ z B

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 09:25 , Processed in 0.445615 second(s), 51 queries .

回顶部