QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

5 }( A d2 G* L

: p0 |, }1 Q: P6 ] 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. $ e; z2 N) r) N/ N S: I 用OD载入,BP IsDebuggerPresent,F9,停了下来: 2 r) ^6 ~2 g; a: c 77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 9 n8 S7 d1 d0 i1 ]3 o77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] ! R! R. y0 A$ Q) d- r77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] ) k& F" Q0 r" n7 ]4 o6 q ~8 c77E5274D C3 RETN ( Q' w" w8 V' ~! f6 n0 l / W6 }% U+ `9 G5 I* t& C) I F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, 2 n2 _, C0 F* @1 F! H8 N. z, z; s重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 / a, `4 `0 J' g& E/ n6 x1 I00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 2 _; {9 c! e: G+ A3 o00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] 1 U+ v8 y( b/ Q- o& O+ c; m* R1 N6 x00C23D68 58 POP EAX 4 O# |' D. b# g: Q4 J00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 ) o, K+ S! o6 `4 K$ R" L7 y* D$ J00C23D70 74 14 JE SHORT 00C23D86 2 V% A) E/ v7 w) e1 C8 f% l" u 00C23D72 6A 0C PUSH 0C , ^" H( ^+ ?; B0 s) @; t00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC ) u# C5 q0 l, a4 n1 O 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] ( k$ @+ S/ W8 l) k 00C23D7C BA 04000000 MOV EDX, 4 ; q% ^4 ~ W( Z/ f+ J! r 00C23D81 E8 8ED2FFFF CALL 00C21014 ) v: t$ O* p1 Y* M7 m) o00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] 5 p1 y( r; l# p 00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] ; ~# Q) Z& S2 O4 c, e 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] / D' J/ Q: R! W' Y; _ 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 / i* v: V6 |4 @. N00C23D92 74 02 JE SHORT 00C23D96 : T$ p P# Z0 k" T; E 00C23D94 FF30 PUSH DWORD PTR DS:[EAX] " K6 t- s( [/ `. e! g2 C 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] / J0 i8 c* D# H4 t00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] * }0 z4 d/ I6 \& O 00C23D9C C3 RETN ; G& q/ K/ W1 ^/ @3 _这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. - m( [% E' U( w* |+ N, JAddress size section contains T" w% |: P8 Y* g00401000 00161000 code 3 K. U0 x$ G$ |9 T 在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 5 N* E, x1 A2 c! T) y 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] & H, Q" o7 h3 @# N5 \ 0040727E 8BC0 MOV EAX, EAX - u. L9 |0 }% c, _00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] ( w1 z- |% O7 w* s+ o3 D 00407286 8BC0 MOV EAX, EAX * U1 l9 Y: G' x+ ?00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] ( {4 P# Q8 m& [/ Z0040728E 8BC0 MOV EAX, EAX X1 Q+ x+ x8 b0 j+ ^00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] 5 H- N5 d+ x# m% y- }" L9 p n00407296 8BC0 MOV EAX, EAX / K+ y: r) p) P5 d; f. C8 N' } 00407298 50 PUSH EAX , G" G, Z0 B& i, }00407299 6A 40 PUSH 40 ( b* g% t1 q, m: ]7 `( a& E1 X 0040729B E8 E0FFFFFF CALL SystemCl.00407280 , G6 A/ Q( K2 o1 _ 004072A0 C3 RETN % `1 k( [( _/ o2 B5 A. y 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: ) T/ y! _* k% k 0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 4 J8 Y: y5 u1 k4 j00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 4 C+ j$ Q$ D, G6 [3 ~9 R0 [00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX . {/ h6 z: o7 p8 s7 O5 Z' a: W0040735C 33C0 XOR EAX, EAX : l9 z5 W2 O& W i, P 0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX 1 q6 c) |$ f9 ?. l2 T1 | c. @9 |; ~ 00407363 33C0 XOR EAX, EAX . X6 U; {& @4 E6 @8 K8 S1 d: ^) I00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX # X5 M& r4 L3 w( V+ L& x0 E) E 0040736A E8 C1FFFFFF CALL SystemCl.00407330 6 `5 h! i6 @7 O3 O 0040736F BA D4205600 MOV EDX, SystemCl.005620D4 5 P& p7 R; ~. M+ k6 r6 Y9 E! o 00407374 8BC3 MOV EAX, EBX % I X8 i, y1 ?3 d 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 . z$ Y# M5 A+ g- q 0040737B 5B POP EBX ; T4 N! u% V* ~# p* K) a( m 0040737C C3 RETN ; a1 ?% E8 ~ E6 p7 l* A 到这里我们要做3件事: / m5 {" U; o5 V. F* { 1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. ! R, M' L, [+ U4 l# E2,记下EBX的值560d08. $ k5 H6 e' [ V8 l) t. y3,先修复好引入表,修复方法如下: # ^' p, N, o! |0 h( }, p) ^% F 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, 4 `4 l! m7 Y1 \% r 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. % A; Z& @6 R$ p2 \& M 下面就是修复入口处了. 7 q( o# |0 H& H# b3 o : r- e9 S$ m. N4 k2 q: C. I( M7 S 回到原程序.按几下F8,过了RETN我们就来到程序入口了. 9 [2 h2 A7 e- [5 t/ I& _4 R 005613DF 0000 ADD BYTE PTR DS:[EAX], AL 0 o! d1 b$ \7 ^6 ~$ G+ T005613E1 0000 ADD BYTE PTR DS:[EAX], AL $ E7 y8 }0 R5 y% i. }/ q I 005613E3 0000 ADD BYTE PTR DS:[EAX], AL " D k; s) \, @9 k' Q0 }7 G005613E5 0000 ADD BYTE PTR DS:[EAX], AL - z, V U" I1 [005613E7 0000 ADD BYTE PTR DS:[EAX], AL % f3 x1 O$ M$ B- z5 i- K 005613E9 0000 ADD BYTE PTR DS:[EAX], AL / Y, k: _3 \3 t, b$ v( p" s 005613EB E8 4C5FEAFF CALL SystemCl.0040733C ! x2 h* Y" \! P# y8 t5 f# _8 M005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 q+ ]& `/ N* r6 i# o+ A& e" A. a2 d 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 ; R/ d0 T) n4 A% z005613FB 90 NOP ! ]4 i1 n! J, B+ y6 R0 R4 b程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 9 y: Q, d. @% w/ I' K0 m, A改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 0 E9 A8 N! z! v- |6 j" y" {* r8 {' U 是用D7写的,D7的代码特征是 . w0 `5 e2 x+ C0 e* o" i+ aPUSH EBP & R2 q& m& a, z3 s! T; l MOV EBP,ESP 8 O* k' O1 E0 u C ADD ESP -10(也可能是ADD ESP -0C) ' C& ]3 r) p" V, @MOV EAX,****** . n$ q$ q; O. j+ ~5 x( n# E+ l所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 1 S% q9 i! b% \& A/ [005613E0 > $Content$nbsp; 55 PUSH EBP 1 n0 i+ Y2 t/ n% {005613E1 . 8BEC MOV EBP, ESP & I# k* R% P9 R; z" n: V% g. |2 v 005613E3 . 83C4 F0 ADD ESP, -10 6 t; |4 y+ t& l6 H 005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 ' O2 V- C- a3 K0 o0 v! Y& ]005613EB . E8 4C5FEAFF CALL jjjj_.0040733C 9 S0 g1 O$ T2 m' s005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 8 ?$ [4 `: S/ d' U( m% B0 {005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 $ l. @$ e' t, N: e/ r: Q 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 1 J3 c! B( d) O/ S) c0 y9 ?" ~ d1 W

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 01:57 , Processed in 0.434233 second(s), 52 queries .

回顶部