QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

- S% P- t/ [9 ]: }4 b

. _& _6 ^, G( o: V7 X& u& a0 P: q新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. " m8 s# [3 D8 _8 a 用OD载入,BP IsDebuggerPresent,F9,停了下来: 8 J; L2 C! y: J( h# W* a# A77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 9 ~& U* o6 K% w; F" x+ E 77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] / P/ f$ ]' s0 p6 n: q77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] 0 _; Y6 g& S& }# s77E5274D C3 RETN ' N4 C7 H& `6 { . J/ K8 V" ~( H+ F+ I O6 z8 |( o F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, 1 T! o- f1 f; Z/ x/ [重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 . w9 O* n# \/ B* C00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 1 S. h4 P) Z, O4 m/ l6 Q* S- `9 a6 `00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] & H1 b9 A9 Y$ [$ N- N) \ 00C23D68 58 POP EAX 3 I2 o/ K3 N/ {) c) G$ O0 i x00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 ; s6 j7 d! u" T' b00C23D70 74 14 JE SHORT 00C23D86 . V7 o, n9 X3 w) Y 00C23D72 6A 0C PUSH 0C B' X. ]2 P# K. E/ [00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC ' y* y9 z7 h% a; r+ r 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] ) z0 o# ~ w2 j) J00C23D7C BA 04000000 MOV EDX, 4 2 q3 W7 s! C" K( h9 l2 n 00C23D81 E8 8ED2FFFF CALL 00C21014 $ a$ @# U0 H/ A+ Y' [ V00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] j1 u2 u$ s: i6 W" a00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] , P- q" I1 m: G! r. @/ Y00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] * `4 A1 S" w9 F. b1 ?5 k4 b1 s 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 9 C# \0 X6 f' u1 ~# g @3 }00C23D92 74 02 JE SHORT 00C23D96 * K8 y( U2 E' r# i9 E. A00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 4 d0 w0 R/ U! U6 Q8 B" N- m, n 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] / V) |: H. f* l+ D# c" p5 ]00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] 4 s. ~& i; @7 ^7 r. D00C23D9C C3 RETN % ~$ j) z; }1 U1 J! c# n这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 8 q. D$ h. N5 e. ~( H2 WAddress size section contains ; a6 l8 B0 @% @8 b. _, m 00401000 00161000 code 3 @, ] _, g; H 在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: , e! _, c+ y5 s4 C00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] + V9 \1 ^0 |1 b* S; t) J; k1 ]) W0040727E 8BC0 MOV EAX, EAX * O9 D) N2 f/ ~: X5 e% J00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] . ^# g: d3 S( W00407286 8BC0 MOV EAX, EAX ( J3 b( B% k6 }, T4 E- b00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] 6 ?4 v% Y4 L% L3 K4 R2 o 0040728E 8BC0 MOV EAX, EAX ) t# C. f% r I: N+ A% j- E4 `00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] 7 I( i, `& B( V# ~, W8 X! d 00407296 8BC0 MOV EAX, EAX : W( U; [( Q5 W& M/ N5 Q) V8 k00407298 50 PUSH EAX % d3 q1 X7 Z t* n( W- y6 d00407299 6A 40 PUSH 40 3 ?! J2 S* P" e8 t" I3 e+ {7 ~+ ` 0040729B E8 E0FFFFFF CALL SystemCl.00407280 % _0 I# V/ T* G5 t, v9 z9 S* T 004072A0 C3 RETN 3 m3 H& p1 x4 I2 l: {$ |这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: 1 D L6 i Q: s" ]3 {" l9 x! J8 p1 `0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 * E; [6 x9 _9 q& D 00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] : t2 V E$ k/ @0 `00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX ; {/ ?8 v% y% k; ?1 z$ e4 P 0040735C 33C0 XOR EAX, EAX " v6 O- [* ~& H0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX ' x; t7 q$ S* r+ ^ 00407363 33C0 XOR EAX, EAX ) f) o4 z s( G* n) e/ o 00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX ' @& F. A, P; O* N6 }: P0040736A E8 C1FFFFFF CALL SystemCl.00407330 : ?; {) M w7 \4 W7 _ 0040736F BA D4205600 MOV EDX, SystemCl.005620D4 8 _9 M: @: K) z* r 00407374 8BC3 MOV EAX, EBX $ S$ |' Q _" w8 I00407376 E8 75D8FFFF CALL SystemCl.00404BF0 |# E% X8 L$ T* M 0040737B 5B POP EBX % \8 c3 ]1 T2 ?6 O/ l6 P4 j1 O0040737C C3 RETN ; ]! }2 C- p9 e. |: S 到这里我们要做3件事: / P' k, }- m9 [0 g1 |: J1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 6 O/ S0 j% o2 ~2 K+ b; z! B+ }: b 2,记下EBX的值560d08. 1 j( u# r3 ]- U) y' e% ~$ k 3,先修复好引入表,修复方法如下: 6 f t/ P+ Q4 Y' R看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, # W% ^+ N1 `0 x 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. . E8 R% d2 C: K, Q, E$ n3 a 下面就是修复入口处了. ( v& ]3 u' q6 i- ~! r" v1 a( J& D5 }- T9 Z" y& `" z 回到原程序.按几下F8,过了RETN我们就来到程序入口了. & u7 Y2 S1 `* b8 z 005613DF 0000 ADD BYTE PTR DS:[EAX], AL 6 Y! E) Q( @- V2 H) T, [005613E1 0000 ADD BYTE PTR DS:[EAX], AL 4 h" [( E ^' r5 z 005613E3 0000 ADD BYTE PTR DS:[EAX], AL & b) f4 X5 {. k5 a. u005613E5 0000 ADD BYTE PTR DS:[EAX], AL ; k$ ^5 `: ^0 s M4 z$ ?7 z ? 005613E7 0000 ADD BYTE PTR DS:[EAX], AL : t! h6 P+ B5 b0 F& ^- A2 J( I 005613E9 0000 ADD BYTE PTR DS:[EAX], AL 1 Y! P4 v& K' _, E0 Q* p% Y005613EB E8 4C5FEAFF CALL SystemCl.0040733C : _0 K1 ?, m# |7 n$ I005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 " X& M7 e# }2 t o* E; E005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 . ]$ r B6 j- ]* x# q 005613FB 90 NOP % }( s: u2 b9 o. r1 v8 l* u程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 , i' T, ]! E! e) b/ L改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 & l5 b( f. R5 }: P4 d1 Q* f 是用D7写的,D7的代码特征是 ; K8 ]% Y& d, J. d# B- k6 W PUSH EBP ?, K" w- u aMOV EBP,ESP : U) z" D1 T( {) a s- x" LADD ESP -10(也可能是ADD ESP -0C) 2 q& G- Z s2 P, a! T* W6 s MOV EAX,****** 0 d: {5 i* X: O2 u) W- h) C所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 8 ~/ x3 r9 B8 _4 r$ l$ E005613E0 > $Content$nbsp; 55 PUSH EBP # G% R6 i: ^# u0 W3 n- z005613E1 . 8BEC MOV EBP, ESP & g1 m; ^' }5 g) | 005613E3 . 83C4 F0 ADD ESP, -10 2 Y* I4 P* R4 `. ^' S 005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 * N# U- v: p. }9 _1 J% ` 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C $ A0 Q' l! b! Y( j$ }005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 8 m5 A, u+ L1 k005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 * Q9 g2 m1 ]& p" G/ @ 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. ' o5 t/ U8 C' T6 r: c5 j8 \0 w/ T

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

回顶部