QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

. |7 O3 g/ s8 Z- t6 ~

7 @5 }' V% `. O新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. $ A: |' S7 p* Q1 N) ?' ?+ g7 X用OD载入,BP IsDebuggerPresent,F9,停了下来: " P: L3 z% V" s' U$ u; C 77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 0 @, I: C* M, R, ^ 77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] * |+ j) E! n; X& Y- u, i7 X; X 77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] % Q ]% f# i0 F. Z. H5 L 77E5274D C3 RETN 0 t4 X# ^2 r/ s$ ~; ~; F, W, }" Y2 B# z. J$ q* R7 U F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, $ E4 _7 F; b* v3 o, ?0 } 重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 * v# D4 y$ W5 R8 [/ l% r# x n& H00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX * j7 Y4 R' O$ L" ? p00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] ! [6 P& m+ }5 @) i% z00C23D68 58 POP EAX 1 h# D- c; M, r" ^, p 00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 9 u# X/ P- I3 H& K5 q0 Z7 M 00C23D70 74 14 JE SHORT 00C23D86 5 n# j' x( c: o 00C23D72 6A 0C PUSH 0C 9 r B7 [ ]; _ 00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC 8 r) L* C8 }( p( K& s& {/ J1 w! B 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 9 \9 [# z6 F# T# a3 o7 `5 R00C23D7C BA 04000000 MOV EDX, 4 $ `4 _ O, @% U$ W+ S* z: y00C23D81 E8 8ED2FFFF CALL 00C21014 8 Q; F% E2 i8 e: t( Y. x* n. J00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] . G" s7 z7 E$ k4 S: \ 00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] ( y( X9 X5 F$ W6 D 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] % U/ q" }7 x- N+ o00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 . ^, i8 W3 F+ r& X" c9 R 00C23D92 74 02 JE SHORT 00C23D96 # n& ]8 O5 I% @& Y00C23D94 FF30 PUSH DWORD PTR DS:[EAX] " K1 O- w3 m0 Z7 _00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] 6 o( ?8 C3 J- R" v% o6 ] 00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ; {/ i4 s3 G! e) G! `1 p00C23D9C C3 RETN s0 E8 e% @& M( X1 h 这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 6 x3 `( s, _+ l( oAddress size section contains % W9 c& W% o9 W- E" S0 ^ 00401000 00161000 code * k* s/ @7 p2 U1 q, _; Q1 D% d在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: & ^4 m! Z6 \- h$ [& \8 {5 B# X) \00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] ' W6 t1 k! C, M) X+ B" \& Z 0040727E 8BC0 MOV EAX, EAX " }' l( d( I( U5 a8 m" w 00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] ) Z. `" C) K7 Z00407286 8BC0 MOV EAX, EAX # p; Q. \' o2 D# m1 ~( u00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] , @& e0 V+ s) x, }; b( y 0040728E 8BC0 MOV EAX, EAX + q. W& y4 T) L/ i00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] 8 b5 w+ m4 j& R9 H: m 00407296 8BC0 MOV EAX, EAX ) Q' |& P* Z2 R9 t8 g6 U# L00407298 50 PUSH EAX 9 h0 i0 ]. N9 H: g E9 R8 D 00407299 6A 40 PUSH 40 $ I9 }8 L2 u w4 V, _# [9 `; l0 _0040729B E8 E0FFFFFF CALL SystemCl.00407280 4 t9 V$ Q' Z. y# i* E* N004072A0 C3 RETN . \* e8 c& {; a0 b这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: $ O6 [- |2 k1 k1 m( r0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 5 b- z# M/ j) f u7 ~4 P0 G 00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 2 u9 X8 O: w! C$ i 00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX ( D' A3 b9 g- V! V8 \ 0040735C 33C0 XOR EAX, EAX & W' ~ F) @1 J K0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX " ^7 H! s/ j: j4 U( B8 p5 Z00407363 33C0 XOR EAX, EAX + i% }5 p2 x% ]' Y5 x( e 00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX & ~. ?) T. S9 H8 Z# Q Q" p2 [ 0040736A E8 C1FFFFFF CALL SystemCl.00407330 , }. A% J& G& P3 G. G5 y, E; j0040736F BA D4205600 MOV EDX, SystemCl.005620D4 / T# T& D; t5 R$ q5 t 00407374 8BC3 MOV EAX, EBX 1 \+ n. @; @& @$ g6 a$ R% f7 j 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 - l: Q. T' s: N0 V8 r2 G% S 0040737B 5B POP EBX 6 M0 ?% [1 t$ D6 n8 V 0040737C C3 RETN 5 C- W% z% l* S, A2 U 到这里我们要做3件事: 6 Z: p8 j# v- r% n; t% @/ D1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. + o/ [* T* i% @2 n7 A6 s( G3 B2,记下EBX的值560d08. / e2 c0 Y. Y8 a, _5 v 3,先修复好引入表,修复方法如下: 5 e7 s; e! N% X* [3 f1 B& x 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, 5 L4 T# [8 `) `* C% b 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. & _' D2 [9 z+ R1 K, M 下面就是修复入口处了. $ f; o) T/ v' \ - o+ T/ i* X0 h: M 回到原程序.按几下F8,过了RETN我们就来到程序入口了. % O& d0 }8 j, _ Z u5 H) ?+ m 005613DF 0000 ADD BYTE PTR DS:[EAX], AL 5 G4 C+ @! B2 E# G/ u# s005613E1 0000 ADD BYTE PTR DS:[EAX], AL 8 h( f, G% N2 R5 r 005613E3 0000 ADD BYTE PTR DS:[EAX], AL % I' g& F4 z' B6 l2 y( I 005613E5 0000 ADD BYTE PTR DS:[EAX], AL ! z9 L1 y: D- [$ ] 005613E7 0000 ADD BYTE PTR DS:[EAX], AL ' N# D" n2 r- N; F9 G 005613E9 0000 ADD BYTE PTR DS:[EAX], AL 2 f0 b/ `! y4 x: C6 I8 B' V005613EB E8 4C5FEAFF CALL SystemCl.0040733C 4 I# i0 ^9 ?1 o$ n6 k 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 # ?: {, ~3 } e8 T. p 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 , F' X2 L% y" f4 b* O005613FB 90 NOP / D$ Y# W- K+ W; {9 _程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 & I/ C7 {8 n/ k" \ d 改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 * O: r, `, p- k, j% ?6 w! ?5 n是用D7写的,D7的代码特征是 , y. H l7 W( N6 Q# _& h: K PUSH EBP $ P8 n" J1 I% ^7 n MOV EBP,ESP , K* b3 ?7 f& o" m4 tADD ESP -10(也可能是ADD ESP -0C) ; f) V4 F- u6 u# NMOV EAX,****** & C, M& [" U& L h所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 K9 G, \( j1 N) {005613E0 > $Content$nbsp; 55 PUSH EBP 0 X) q5 Z3 o; _ o. [ p2 [" m" v005613E1 . 8BEC MOV EBP, ESP 2 P4 r( a" B6 O005613E3 . 83C4 F0 ADD ESP, -10 4 _) t- t0 a" ~3 Z w: B% u 005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 ! r1 `. t: Y3 f, o8 v) v 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C 9 e6 ]- T0 K8 s& P005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 1 x" ?/ _( g% q7 ?: B 005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 0 D. C2 j2 t% [9 ~ 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. " I7 f" A! z& |2 M" V+ W4 q

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-4-19 08:42 , Processed in 0.407769 second(s), 52 queries .

回顶部