QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

: t0 _: P9 `& l! k/ a* C7 A

# o; J2 H6 S( H3 Y8 g 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. , G/ q, Z/ R$ s2 y d8 `" o( g$ I 用OD载入,BP IsDebuggerPresent,F9,停了下来: & i; C. d+ t2 s2 D7 ^1 i1 v77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] - Y, C- s4 w6 O5 Q+ B 77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] ( P! a3 N- R+ `3 P77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] 3 N M8 C8 k% K+ I/ R$ e3 G 77E5274D C3 RETN 0 Y( ]) c2 }. N/ E. m n2 N, \3 M4 e: |' A; W F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, ; \! P- x9 ?' L; n* `3 N7 R 重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 - w: `+ Z1 {, E% ]! Z5 M 00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX % l+ S. i' l4 |* g7 u" t5 @ 00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] $ o+ r6 g2 n- e/ |. o; C' s 00C23D68 58 POP EAX : [- ^; Q4 e; Z 00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 % ~, ]6 W4 H# ?8 K# c ^4 K00C23D70 74 14 JE SHORT 00C23D86 2 u3 F2 N; p1 f0 f4 n: U) m% \$ V. \ 00C23D72 6A 0C PUSH 0C % L9 ?$ M& G2 g# x3 A9 Q& ?, a00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC # J& \& V- p+ {5 Z00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 0 S5 t6 j+ N' u: Y$ q) c7 i 00C23D7C BA 04000000 MOV EDX, 4 5 i$ @5 C; P0 K+ T. E6 ^00C23D81 E8 8ED2FFFF CALL 00C21014 / Z. n( |; H5 n$ d5 p8 q" ]! j. [0 j1 _00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] : w0 j# R; q: r/ d0 k+ M00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] & |- L9 d+ e( u+ ~( G* i3 h 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] 9 V6 w2 D, g5 ]! _# E00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 4 M3 [# `/ p# G W$ E00C23D92 74 02 JE SHORT 00C23D96 # w' T3 p" X% R. _9 ]3 `, Y3 Z- }& ^00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 5 y7 s" Q/ |6 M00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] # N" U3 g7 x, j; `- l00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] 0 [! e8 U7 p; F- T" X$ V" f8 C) W/ |5 ^00C23D9C C3 RETN - f6 x* E/ w, j+ s- M D: ?这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 8 C0 b* C$ f# \& N- R+ v q Address size section contains : I+ ]8 f; q9 Q4 w8 E: v% ~. T3 p 00401000 00161000 code # z- G8 \* j6 C/ B1 [% T5 @& T在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: - X% z2 p( y) X 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] % _& _- h; B7 {5 I" S" G5 l 0040727E 8BC0 MOV EAX, EAX + B8 m" k) y! B B$ i" @* ?00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] % Y0 G1 s+ h& e, F! \: V1 g9 ^3 a00407286 8BC0 MOV EAX, EAX 8 a9 n, x7 a+ t 00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] 8 X) y% Y9 D# U ~9 N 0040728E 8BC0 MOV EAX, EAX ( Y0 J4 X; g! |3 b/ a5 K 00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] # M1 T. r& I6 q% p00407296 8BC0 MOV EAX, EAX * J' `1 B* i6 ?9 y+ |8 l0 H- `5 w00407298 50 PUSH EAX 6 S; B* @4 z) @/ Q( R! T3 m( r00407299 6A 40 PUSH 40 0 t8 D" q* F7 { E0040729B E8 E0FFFFFF CALL SystemCl.00407280 7 }+ o5 E5 w, `! W004072A0 C3 RETN 6 s# }7 A: |' ~这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: H" a$ q; O9 I* p+ S 0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 % J' A- X" M; X2 q) s( U& k 00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 7 K T% O! j1 x" I* G* U' w 00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX , B+ y9 e# G, n! K% s6 K0040735C 33C0 XOR EAX, EAX 1 d; R T/ Z( w1 V q 0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX - z, y$ {0 X4 V/ J( i00407363 33C0 XOR EAX, EAX : A" L2 `( c! Q: r 00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX . R8 ~, s3 q' f 0040736A E8 C1FFFFFF CALL SystemCl.00407330 8 d' |$ y1 U* v" h# d+ M+ \1 J0040736F BA D4205600 MOV EDX, SystemCl.005620D4 % o+ d4 }5 @* }2 Q 00407374 8BC3 MOV EAX, EBX $ c; o+ ?+ Y F. B: ^6 q# _% G00407376 E8 75D8FFFF CALL SystemCl.00404BF0 - s7 A! Q+ h' q& H 0040737B 5B POP EBX : I3 f/ M0 E9 C/ [1 m1 T% p 0040737C C3 RETN + v# ^0 }6 Q8 e* o( K 到这里我们要做3件事: * Z# c3 Y. C) E0 J1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 6 z' ?( {+ ~9 S, M4 q 2,记下EBX的值560d08. 2 @: C" l1 Q1 q' ?6 L5 e9 R0 l 3,先修复好引入表,修复方法如下: 5 i# ?4 t1 ]5 @3 \! ] n1 g看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, 0 j+ x* F1 S& k* q1 D* z: G 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ' k9 k3 P B" [- L5 d 下面就是修复入口处了. 1 S6 S2 z! n( O/ W# Q 7 R5 P r$ h. y! {: ^ M/ @6 Z" C 回到原程序.按几下F8,过了RETN我们就来到程序入口了. 4 Z( ~1 O: B# M2 E; j9 F005613DF 0000 ADD BYTE PTR DS:[EAX], AL : D" U$ P. v5 r: q" ?5 b. U005613E1 0000 ADD BYTE PTR DS:[EAX], AL / a$ i( E* t9 E; y( }005613E3 0000 ADD BYTE PTR DS:[EAX], AL 3 A+ y& |0 y2 Z005613E5 0000 ADD BYTE PTR DS:[EAX], AL / L: `0 B, X6 u, ^2 {005613E7 0000 ADD BYTE PTR DS:[EAX], AL m- T" s8 N0 H: U; K9 @ A! B005613E9 0000 ADD BYTE PTR DS:[EAX], AL * U; k/ |; R9 N005613EB E8 4C5FEAFF CALL SystemCl.0040733C ' V) r1 Q% ]' i5 a, H. o7 O+ f 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 $ u" e9 M1 B) \005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 ' R4 j, A( @- |6 |/ e/ u, a 005613FB 90 NOP & F0 h- D$ i# @, d程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 , ?% k% t$ b; Y, u$ N改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 & S" U% V, ?0 h是用D7写的,D7的代码特征是 4 ?7 G- p! N8 a0 u" NPUSH EBP / q) B& V9 ]! L% I8 O: t; s MOV EBP,ESP 8 C; T T1 A/ J& p$ q ADD ESP -10(也可能是ADD ESP -0C) 1 }1 e2 f5 U U+ V MOV EAX,****** 4 S0 H) x) E+ m& \' c! g" g; M 所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 " v6 r" D, U6 l005613E0 > $Content$nbsp; 55 PUSH EBP 8 m2 _3 A& M3 i/ O005613E1 . 8BEC MOV EBP, ESP ) i/ W8 k7 p2 J1 _6 [005613E3 . 83C4 F0 ADD ESP, -10 # {# f s. R+ I005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 2 ?) T+ |* ^4 }! N) ~005613EB . E8 4C5FEAFF CALL jjjj_.0040733C ; X4 J# |) W5 L$ [* C* T005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 , U* V9 a& y' H+ V6 \& B; ` 005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 / O, B- w& ~& T8 S保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 6 f2 M7 w7 l% ?

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 02:47 , Processed in 0.386791 second(s), 53 queries .

回顶部