QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

5 K9 Q1 |4 x4 b% ?1 m$ x Y

; D# m' E8 ?& d3 C5 X5 b7 ^新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. + }; ~! P7 ?* `4 `9 \3 D用OD载入,BP IsDebuggerPresent,F9,停了下来: ' P F0 c- z* s# ^1 }( Q. a77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] I. Q5 e5 U0 e9 u, ^1 f- k77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] - k9 ^0 b/ i8 g( f) O 77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] 4 f! R$ H1 @7 p/ \4 Z 77E5274D C3 RETN 1 ]5 t, A! s0 }# d. U, Y ) P' U, t7 }; z. s. D XF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, . g4 [ O, Y% a: @: \8 @% c 重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 ) i! e% W. ^! n# K5 Z# R" e+ v00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX . w) d1 \6 D0 n6 S00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] , w% x& f3 d6 j. \: o00C23D68 58 POP EAX " @2 C, u7 T) p9 d 00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 , [1 n$ m" A) V" G0 w 00C23D70 74 14 JE SHORT 00C23D86 ' y# ~" \% f3 f/ o! H3 T: e 00C23D72 6A 0C PUSH 0C % a" Y/ _2 \, E 00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC ; o8 m3 i- O+ C2 }) g3 n5 _4 F 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 9 W& F. k0 O3 v0 O f4 L6 u 00C23D7C BA 04000000 MOV EDX, 4 $ a3 H" _) @7 _ C00C23D81 E8 8ED2FFFF CALL 00C21014 0 q$ J* q& a# N6 U' n00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] 5 q' X# L Y# h; Q2 J 00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] % q4 e* W' z6 g00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] 9 q* h+ O: |2 V6 g& _ 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 : ?3 b# o0 \8 b# u 00C23D92 74 02 JE SHORT 00C23D96 ) Z1 H2 k2 Z" J9 y9 E 00C23D94 FF30 PUSH DWORD PTR DS:[EAX] , d( P- `8 w8 E) q- A00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ' u& Q6 X( q3 p3 t, d00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ( b7 y7 B x' {" z# C1 I- h5 @ 00C23D9C C3 RETN ; ]+ \. g, q" y这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 4 \2 b3 L# b+ M- N9 A( XAddress size section contains L2 i! u$ f% U1 R6 e; }6 Q! O00401000 00161000 code : f1 U4 d% i9 a$ L- y在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: ; }9 G- j' q9 ^' I! b 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] 0 d0 ]1 C" q' E# ]0040727E 8BC0 MOV EAX, EAX 1 Y" k) L% S2 l 00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] 3 O" u8 j7 ]: H$ C3 y! t00407286 8BC0 MOV EAX, EAX 1 H( R% k6 R$ q6 ^ 00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] " P: n6 l, y& R4 A/ F. V; f* s" l# t 0040728E 8BC0 MOV EAX, EAX , [% ~4 {; Q( o0 T 00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] ; t8 l; X% ^3 q {2 {9 u4 D 00407296 8BC0 MOV EAX, EAX Q4 Z( G* J. d" {: g5 y7 a00407298 50 PUSH EAX 4 q. v# }% T$ E) t& r 00407299 6A 40 PUSH 40 # \! ?; d% n, b, | 0040729B E8 E0FFFFFF CALL SystemCl.00407280 ! M4 B" J" D& G2 i% | 004072A0 C3 RETN . D% y# A- x* j3 c$ a+ j# m i这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: 2 X- D5 T$ }9 s" q. g V 0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 . T1 q% \3 W6 n1 ?& R6 m+ e1 E00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] # H: d! L {( U7 M6 p 00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX ' y7 {! z; }2 F- Z. i6 S5 [! | 0040735C 33C0 XOR EAX, EAX & `# |4 x& F0 F; |8 @0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX & R5 E% o% i) u7 U# I; h3 _6 T00407363 33C0 XOR EAX, EAX * A2 \0 i+ i! X# n00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX 5 D: V5 l4 E6 E4 ~0040736A E8 C1FFFFFF CALL SystemCl.00407330 $ ?' A) K5 J3 ^# R0040736F BA D4205600 MOV EDX, SystemCl.005620D4 1 G. x1 ` B! P& g( c+ E3 r8 U/ \ 00407374 8BC3 MOV EAX, EBX # d' \* n7 L8 I; c; ?: S# a 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 $ D2 ]2 F( g* Q: m0040737B 5B POP EBX # m. N- s) c: b9 Z G( \$ e 0040737C C3 RETN ( Q3 ]: Z) ^ y; e 到这里我们要做3件事: ! Y" C- x6 w. M( N 1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 2 I8 N: E! L2 [# O 2,记下EBX的值560d08. / v A, G' w, x 3,先修复好引入表,修复方法如下: / L! z9 a$ D- I; i 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, ) X5 @5 J$ g; g 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. % y! S# ~$ O/ B$ U. ^3 K8 i8 [下面就是修复入口处了. 4 Z) L9 x9 F! p8 X1 @. w$ _ " W2 L5 C) a( w3 X/ l6 t( p回到原程序.按几下F8,过了RETN我们就来到程序入口了. 1 d6 _1 O+ {" }3 J: A005613DF 0000 ADD BYTE PTR DS:[EAX], AL ( Y- d5 a% `0 s2 N005613E1 0000 ADD BYTE PTR DS:[EAX], AL Q# [2 t. h% g. E0 Q 005613E3 0000 ADD BYTE PTR DS:[EAX], AL ( ~0 I8 R( }9 ^005613E5 0000 ADD BYTE PTR DS:[EAX], AL 0 ]. p8 X7 x# d6 {- v7 e, Z( i! L 005613E7 0000 ADD BYTE PTR DS:[EAX], AL 7 l5 _/ ]: @ h005613E9 0000 ADD BYTE PTR DS:[EAX], AL : q' x/ N S2 Q1 l: D0 r8 ^005613EB E8 4C5FEAFF CALL SystemCl.0040733C * _4 d' Q/ t7 _1 w3 V/ F( A! M005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 6 ]7 x( l: g( n. y9 m5 D 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 0 b- E" _. Z% q; d9 S 005613FB 90 NOP 2 C$ t# D( T6 o8 w* D程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 0 [6 [: J% ?3 j改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 . r) R5 m* c0 J 是用D7写的,D7的代码特征是 2 f3 l2 Z7 Q, ^8 a) tPUSH EBP 8 s; A% t9 A7 x) ` MOV EBP,ESP ; W. P$ c O' }: W1 X. Y7 O, c ADD ESP -10(也可能是ADD ESP -0C) - J9 m( t2 ?; s7 p MOV EAX,****** + U: }0 ]( x$ i4 E4 K所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 6 n4 `- W+ B& q+ E* L9 s) F005613E0 > $Content$nbsp; 55 PUSH EBP 4 _% @! x7 Q! D/ |; S005613E1 . 8BEC MOV EBP, ESP 3 N3 ?* F; k: X# F$ d 005613E3 . 83C4 F0 ADD ESP, -10 $ `: L0 P, M8 _9 G005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 , U. v8 Y1 v9 s6 N- G005613EB . E8 4C5FEAFF CALL jjjj_.0040733C * x" C& a8 J$ x! Z5 P9 ^7 f7 B 005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 - p& ] k, K; Q( }0 z 005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 - c1 M# A) L" J: X" u保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 8 z# x8 ^6 Z, {: {5 O6 {

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-8-30 21:24 , Processed in 0.438271 second(s), 52 queries .

回顶部