QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

. l' H9 O$ f# }" c- z

0 F5 n) h" r o( } b# O 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. $ n' T; q% K5 @2 z用OD载入,BP IsDebuggerPresent,F9,停了下来: s0 G! p1 Z& ?5 t5 X$ U77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 5 O! ]# H% y0 i77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] 6 L7 e/ M% t8 |( j4 B" |; v77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] + k2 s( f( F! m0 X77E5274D C3 RETN 9 ~8 r( a; h9 E, _# X2 P/ w) n$ m1 {+ H7 K8 i' v F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, 4 K% Z( n/ @" u+ `; s/ l, J重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 / p( P0 b; H5 D N00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 0 L* W S+ v; [* L2 q6 R# ^" [1 j00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] 2 l5 }/ [" R9 E1 n2 Y$ z1 @ 00C23D68 58 POP EAX $ ?& X0 i+ v: Y, i4 d' K, h00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 1 F$ c$ x Z& W) {4 A1 e8 _, A00C23D70 74 14 JE SHORT 00C23D86 9 I$ g, e# f5 d: J& k 00C23D72 6A 0C PUSH 0C " \4 L9 I5 d$ o1 g6 R# @$ a0 H00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC - M( E7 ~+ c" f* v5 X 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] ! H, F' Q4 i7 J; t7 a+ c* j00C23D7C BA 04000000 MOV EDX, 4 3 D$ P$ Y$ P( e00C23D81 E8 8ED2FFFF CALL 00C21014 * V9 O# c; d5 z: ~+ U8 l 00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] - v3 U* @/ m6 |. n9 G7 k6 o0 @( a" P00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] 3 C$ x1 }5 Q- ^) r" L" z7 z, |, } 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] 3 i% i7 ~% U: E2 _00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 . L1 d1 M4 j$ p9 G- Z 00C23D92 74 02 JE SHORT 00C23D96 6 _7 j9 R: P* D- j6 w00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 9 v7 V! z. L% F 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] 2 z: C2 R6 ^. Y: `# q" p 00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] 7 }4 c3 Y: ~) S+ M; s 00C23D9C C3 RETN : S$ s; u, y, E/ R! C这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. * E& B8 B8 P% y9 H' g, @/ ]& i' AAddress size section contains $ f+ H4 q/ y& p 00401000 00161000 code . Q+ ?( M& ~" ]( O+ h% \. O& r; y在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 7 {0 H) x* U8 k; x% C 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] 1 [9 W2 j+ h3 D7 v8 \( Y( Z8 z0040727E 8BC0 MOV EAX, EAX 4 R! R. z8 b5 f; V6 M d/ I w 00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] 6 a1 V8 X4 A7 c 00407286 8BC0 MOV EAX, EAX ; u4 p, `' }) @; ?! t00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] + M4 k: t4 g8 M( u& I- K, l# b 0040728E 8BC0 MOV EAX, EAX k! \0 x* Q) o! N" S 00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] 9 g' s* R* S% U0 `( F. ^9 k) [00407296 8BC0 MOV EAX, EAX 8 u l ~2 s/ H5 n# ^7 G& ^00407298 50 PUSH EAX 8 t- z8 ^3 Y5 j4 r' B00407299 6A 40 PUSH 40 . N# N3 B( X" ]% f/ M) Y: L0040729B E8 E0FFFFFF CALL SystemCl.00407280 ( j" O W% j1 |$ [0 X+ a5 c5 O 004072A0 C3 RETN 8 b; }; E/ P! m: U+ ~这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: ; D% {' C. g; F) P) L 0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 ' w# ]* B: B4 n7 \8 E00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] & _! ~6 _3 Q7 F1 m! h5 D0 z# G00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX # Z- f7 a7 W9 [; x0 O/ _ 0040735C 33C0 XOR EAX, EAX + W1 W& j* K8 F1 I. H0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX & ]7 V+ b) t- Z; y00407363 33C0 XOR EAX, EAX 9 m! g% v0 m7 K# f 00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX # L. g3 S5 p3 G: l" ? 0040736A E8 C1FFFFFF CALL SystemCl.00407330 4 a& b: ?( ~( b0 U1 z0 A 0040736F BA D4205600 MOV EDX, SystemCl.005620D4 - ]9 b" e+ x: F# ^( y 00407374 8BC3 MOV EAX, EBX * ~& M7 l: A8 f& f- h 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 5 G' z5 D% E/ h! m 0040737B 5B POP EBX . `! u: Q6 I' T: e0040737C C3 RETN 3 B# H! D/ j5 D% f1 m 到这里我们要做3件事: 0 C/ S0 s7 u9 D4 n0 c/ Y2 ? 1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 3 C6 z$ e$ P9 I, T' x0 P 2,记下EBX的值560d08. / s. ]% N' R8 J; i, m+ M; ]) j 3,先修复好引入表,修复方法如下: 0 ]/ S" ^* @, {) K; m 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, & m# Q$ r2 o* @& c6 K+ [6 I* q打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. " h. E9 k0 N2 y' S# o下面就是修复入口处了. % E. z O0 G1 h+ M+ D3 \ . O$ q" z7 G; e) k 回到原程序.按几下F8,过了RETN我们就来到程序入口了. 9 S# d1 l' q5 F* f* z! p \ 005613DF 0000 ADD BYTE PTR DS:[EAX], AL ! _# @; x: ~ H- \ r" M) c$ s* G( ] 005613E1 0000 ADD BYTE PTR DS:[EAX], AL 5 w5 @" v: S* _5 q6 ]+ S9 Y( \! X' h 005613E3 0000 ADD BYTE PTR DS:[EAX], AL / K, G) x6 j3 U2 @ 005613E5 0000 ADD BYTE PTR DS:[EAX], AL ; q" ~* t$ L. z: O- r$ l, G1 ` 005613E7 0000 ADD BYTE PTR DS:[EAX], AL 8 t3 u1 L7 R: \2 R2 E$ |3 N 005613E9 0000 ADD BYTE PTR DS:[EAX], AL : D( ?! e ~+ M i, N: ]005613EB E8 4C5FEAFF CALL SystemCl.0040733C / F" Z1 a( E2 S1 J! O/ E005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 1 ] h7 K e7 L+ a 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 X3 u3 E8 B7 i& z# U3 r( K' \3 G 005613FB 90 NOP % z! u' `' O! l3 { z8 n& c程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 : J$ U; w' B3 Y7 w# m改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 ; r8 b( D' X" n* e0 z5 M 是用D7写的,D7的代码特征是 2 I% Y) z/ E3 a5 p' Y8 f PUSH EBP 0 s$ v1 }( Y2 i3 [4 D: e MOV EBP,ESP % k' C+ w( X5 Q; l ADD ESP -10(也可能是ADD ESP -0C) 2 p. n+ o7 l- K* ~! JMOV EAX,****** - w7 W, ?! ?- d所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 8 m+ O; |, K! w005613E0 > $Content$nbsp; 55 PUSH EBP $ g: T: D+ T0 _8 d/ s5 M2 w 005613E1 . 8BEC MOV EBP, ESP " X* ^/ s, k' n* f' ?" k* @$ G005613E3 . 83C4 F0 ADD ESP, -10 5 j( k. K! z f( O( {( ?# }5 u+ p 005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 7 @6 X/ H3 n4 Z 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C % m: F9 {+ I' v l+ E' u005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 {3 z4 }' h: t% E1 R6 X( O8 Q 005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 / V4 @4 X& Q9 D, h& W) o 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. + U, G( W" W* Y+ u8 i6 J

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-12 20:17 , Processed in 0.415582 second(s), 52 queries .

回顶部