QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

0 l' `* I" ^" K' e8 c# \

3 I9 C& y) z z7 t, s 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. |0 y; T! Z8 y% t( F4 j0 \用OD载入,BP IsDebuggerPresent,F9,停了下来: ) Z: X4 N, S1 O/ F0 {6 n) p3 S0 ` 77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 8 a8 F( \1 ~& p" T# U: V% |8 b77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] + C' j: e" T) B8 m$ i 77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] + m/ }+ _& Z7 e! i- ]- I77E5274D C3 RETN . q3 ?' ~+ ?& i( U , U4 p4 @2 [6 OF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, + y; G- r% j. v0 u% |) n! _重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 0 c# x3 N0 a$ [9 K1 h) B 00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 5 |- ~: a5 l3 x9 A+ V: H+ V00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] # T* O8 c6 E2 b' H5 Q7 Y2 z00C23D68 58 POP EAX * M1 T# s: j$ m; s/ g00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 , w( L) f* I. p0 ~ 00C23D70 74 14 JE SHORT 00C23D86 ' d( a( R# r6 p9 o/ C. V00C23D72 6A 0C PUSH 0C 6 c5 a) [( {' n' t& }4 s00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC ; i' \" ~( ~$ j# Y7 }* u! a00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 8 Z6 B3 c1 y n- t 00C23D7C BA 04000000 MOV EDX, 4 4 j. Y/ g6 x$ b1 o" C0 q2 f00C23D81 E8 8ED2FFFF CALL 00C21014 " G1 b a- M# R# K3 K' e8 L$ z/ t; L 00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] R' ~. ~6 ]6 g" K! S 00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] C+ y4 y) p* ]- \ 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ' Q- u. S9 W" @; O 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 8 d$ E' X }0 {! V00C23D92 74 02 JE SHORT 00C23D96 7 ^7 O; l) }$ o& J( H# e& i00C23D94 FF30 PUSH DWORD PTR DS:[EAX] & K5 J* C) N5 [: q2 U, i 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] % ?* t3 ~! ~0 l2 c) y00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ! l9 i5 o- B% X) b 00C23D9C C3 RETN # n# [$ @& F# f: E2 l. v, o 这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 6 i" B: @% `3 e Address size section contains 9 Y! y; z- ~7 y" y00401000 00161000 code * O& h; E' K8 E. |$ D" M4 M在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: : S5 c5 b+ O+ h, M8 v D. w) q00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] ( U" F T" C& k/ x3 _0040727E 8BC0 MOV EAX, EAX 6 p; p0 h: n# [6 e00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] - j- h+ R. J; N00407286 8BC0 MOV EAX, EAX . b/ y; d. Z' ? U0 {( }: L 00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] . a7 H; E1 N9 W5 F# w6 Q. A) D( I0040728E 8BC0 MOV EAX, EAX " Q I/ H5 J, ^3 g$ v00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] " I$ w* { L& D1 k- { 00407296 8BC0 MOV EAX, EAX * I, i3 R$ u$ E$ p2 w o1 L 00407298 50 PUSH EAX 3 L, u8 K8 n A% W X00407299 6A 40 PUSH 40 0 Y6 L$ ~. ?- l+ g Z' W2 d2 B0040729B E8 E0FFFFFF CALL SystemCl.00407280 . J1 b& m: { \, O7 y004072A0 C3 RETN 7 [0 _( F, V: y3 U. g% c$ D+ n1 M4 r 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: % v6 C% I! G7 j, E4 V# W0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 ) `( [, J/ L/ ^00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] ( r6 D5 }1 I" |+ y3 [( R" @6 R' C$ x 00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX 1 |9 V4 _+ n; M- G4 O! C) T 0040735C 33C0 XOR EAX, EAX : Y; S, D5 ?% ^0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX . |4 R: O& q9 o0 n+ p00407363 33C0 XOR EAX, EAX 1 I+ }( N% @& t/ S3 R" F0 M00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX - l1 r) w$ n) V# m0040736A E8 C1FFFFFF CALL SystemCl.00407330 5 H, D0 x0 }5 s7 I$ y; l$ A 0040736F BA D4205600 MOV EDX, SystemCl.005620D4 5 F2 T1 m- t! V/ |: C3 D! |& z00407374 8BC3 MOV EAX, EBX $ g/ T8 k# ]+ d3 R2 r. ? 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 # |4 _* W4 r- t0 p& g0040737B 5B POP EBX 1 i; Z* V. k' K, C3 \ 0040737C C3 RETN ; C4 f7 A1 Z+ S 到这里我们要做3件事: 3 z" V" r8 H! S0 j: X1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 4 ]( @2 K, H7 J% I 2,记下EBX的值560d08. " t( r% r- f# V- O3 P: p" K* ? 3,先修复好引入表,修复方法如下: 0 M. z/ p5 h% x5 Y" B6 Q% P& q% V/ q看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, , e1 n& ~1 x1 M7 v8 ^, ` ? S 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ) X. n7 R4 ?' A9 ~, E- {. T8 B0 X+ j下面就是修复入口处了. ' Q0 v6 W0 F9 n- q# r2 w6 S 7 e" m0 E4 w! c回到原程序.按几下F8,过了RETN我们就来到程序入口了. / i. C! [. Z$ ?% L" H+ a4 X, B005613DF 0000 ADD BYTE PTR DS:[EAX], AL : x2 O9 C! I0 g: Q; i* B! ]/ S 005613E1 0000 ADD BYTE PTR DS:[EAX], AL 1 S# G/ S3 D8 {" ~: b 005613E3 0000 ADD BYTE PTR DS:[EAX], AL * {( `6 x4 {6 h 005613E5 0000 ADD BYTE PTR DS:[EAX], AL 9 p( I( C1 S$ S7 k4 L005613E7 0000 ADD BYTE PTR DS:[EAX], AL & `( m4 F! j4 p* C1 k 005613E9 0000 ADD BYTE PTR DS:[EAX], AL : ^( G7 k' `4 J. z 005613EB E8 4C5FEAFF CALL SystemCl.0040733C # e& p) u1 u/ ~# H# _% u0 L- Q005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 ) Z2 Y% l0 P( }: x4 O* L \2 `005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 ' x9 M5 }2 a: C$ K005613FB 90 NOP - ] Z1 E) @8 X3 R5 i 程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 8 h3 J0 J4 w1 z+ d+ L改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 ) }5 \. j+ G) R( e是用D7写的,D7的代码特征是 + O) }, A# l2 |2 p# [! R' r PUSH EBP 9 T* z: D$ N/ U: s( WMOV EBP,ESP ! I8 z% ^; w- c% Z! f0 kADD ESP -10(也可能是ADD ESP -0C) # r; I# }. \1 t" S# KMOV EAX,****** 1 h( t; `3 J, _ 所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 ' S- M. ` m6 x* r, l005613E0 > $Content$nbsp; 55 PUSH EBP ; }# t, O2 B' c 005613E1 . 8BEC MOV EBP, ESP * {) y& \6 i" v+ V" {005613E3 . 83C4 F0 ADD ESP, -10 ' q% k' O, R/ M; c7 `: J 005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 , C" Y! \8 A) w" i8 P8 y 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C 3 y+ E$ x/ b# b2 a- ~( {005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 7 k \" ?1 j# z( d) m005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 , {$ J+ Y w$ w' F保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 2 ~3 @$ e2 K* W& v' z, c

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-18 23:21 , Processed in 0.410272 second(s), 51 queries .

回顶部