QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

7 A8 i4 \2 l/ ^2 s

, b: d( k4 ^' t# g6 a' X 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. 7 ]- W7 J; k3 c, u! ` S) I 用OD载入,BP IsDebuggerPresent,F9,停了下来: - J' }- ]! n0 n0 p+ [& J 77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] + U, X8 f$ C- ?! S77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] + Y4 k' t( H. D% ^8 s4 r+ F( u0 e" [77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] - h+ Z2 F, K8 d# D! u: H 77E5274D C3 RETN ; S0 ]/ ], I ~( M# }; f# ]& }; f & [6 k1 W9 g+ X* z0 u2 w3 G# UF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, 6 W; p- |( u' [0 R重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 ; u2 z' s( `1 ^ z00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX # y$ B- c5 ~8 b2 k% E' m4 \00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] + f a: v$ _4 [7 @3 g- i00C23D68 58 POP EAX F% O3 B' B: g* C 00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 # [- L! u4 n2 }: D/ w. P 00C23D70 74 14 JE SHORT 00C23D86 # D/ Y" D7 n3 g P% g4 A7 T00C23D72 6A 0C PUSH 0C % B9 M( L: G1 R8 I; k" ]7 f; l/ ]00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC , p% c. G& q- H00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 4 q4 \1 Q9 p7 w7 z* l$ ~& R% L8 O 00C23D7C BA 04000000 MOV EDX, 4 0 o8 I( t$ |% t3 n4 ~/ e) u 00C23D81 E8 8ED2FFFF CALL 00C21014 , u4 H, `/ R- F2 P% G00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] " _) _- o6 j& k7 ]8 x4 D00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] 5 L. C/ B2 [0 t: k e) _% h7 p, |00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ' G. [8 X* {5 [( d! S/ h 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 ( v$ c& y0 |0 Y+ ^; P) L' a1 G 00C23D92 74 02 JE SHORT 00C23D96 ; @! R4 ~- |% E 00C23D94 FF30 PUSH DWORD PTR DS:[EAX] : {. y& g2 O3 o 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] . w( D$ u9 X/ I' K6 c 00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] 4 ~) R/ z* a. S. p; w' X- I 00C23D9C C3 RETN # F1 C4 H, w; f& a这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. ) A& U; U! c: s; Z4 l; d, C3 g8 X Address size section contains ( G; b3 c" V' P; R* S( K$ d6 k 00401000 00161000 code 5 ]4 o" _0 F% V) v0 U( o# Z 在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: # L) W& v0 R. @8 W& f& f 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] " k9 N, ^* _6 z* n, a 0040727E 8BC0 MOV EAX, EAX 8 t- X; \( w/ j00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] 2 ~* ^. l7 Y1 C- C7 F. Y5 D5 i00407286 8BC0 MOV EAX, EAX 3 C o4 X% F' n) h* \& R 00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] 5 A$ k" x2 B5 l; w; t& m 0040728E 8BC0 MOV EAX, EAX " r9 t! q2 c& J; ?6 f00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] # {6 g# y3 V2 f/ I00407296 8BC0 MOV EAX, EAX ( r% L& k" o# B6 q; ? 00407298 50 PUSH EAX 4 X' p1 Q: w" y/ H! L% }# h7 \ 00407299 6A 40 PUSH 40 ?. u# x) g- A4 p% m$ }0040729B E8 E0FFFFFF CALL SystemCl.00407280 $ N1 u5 }4 T6 h5 T 004072A0 C3 RETN 2 p2 b3 Y# O0 c# s5 r$ L3 ?这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: 4 ~; B) N& R( P" J4 k# Q0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 1 f! p% a4 C. E2 S) f6 T+ w00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] . e8 L( R! y( V( I1 p9 E9 x+ ]& C9 U7 S 00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX 4 c `# L6 W/ I# t$ S0040735C 33C0 XOR EAX, EAX % f4 r, X1 Q. [# ` 0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX - l- g" j U% d) v. x0 d8 g00407363 33C0 XOR EAX, EAX 7 g& g% a9 n( p 00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX - }. [& a0 {2 S$ h& V 0040736A E8 C1FFFFFF CALL SystemCl.00407330 - p2 o" Y6 [5 g% | S6 h7 e 0040736F BA D4205600 MOV EDX, SystemCl.005620D4 " [+ a6 r& Z# N$ g! l00407374 8BC3 MOV EAX, EBX 2 b( [3 x: B6 i00407376 E8 75D8FFFF CALL SystemCl.00404BF0 % w. v7 d; l9 {# h 0040737B 5B POP EBX + [# m( t; U1 {* N9 l 0040737C C3 RETN ; x/ ]( E5 c2 V' ]到这里我们要做3件事: 8 U+ @& J" G0 z; _/ F: b% G1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 9 l2 Q6 L: B! C0 q2,记下EBX的值560d08. ' d& o# h+ W' \. ]) B- C 3,先修复好引入表,修复方法如下: 5 c8 I" ?2 Y, U7 E0 Y6 E+ f; N M8 P 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, 0 F( b9 L- S S g( M. n! \* ? 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ' J$ T j" h5 ^& [" ]" ^( c: ~下面就是修复入口处了. 1 x5 @7 F$ d, `7 K. A0 A4 u + z8 d% _$ w+ A& Y# K回到原程序.按几下F8,过了RETN我们就来到程序入口了. . G; Q, E5 V$ U4 K+ F0 J. ~005613DF 0000 ADD BYTE PTR DS:[EAX], AL 3 h4 v$ y0 C8 m& g 005613E1 0000 ADD BYTE PTR DS:[EAX], AL ) ~# {& s- h7 i/ I' ^ Y# K005613E3 0000 ADD BYTE PTR DS:[EAX], AL $ P+ i) V$ j9 i; g! C& n4 z+ h, M+ P 005613E5 0000 ADD BYTE PTR DS:[EAX], AL 0 d B" `0 u2 b. ~! D: n8 p 005613E7 0000 ADD BYTE PTR DS:[EAX], AL / Q- \. ?* h: v005613E9 0000 ADD BYTE PTR DS:[EAX], AL & K: _3 |0 s4 F; L: m% }4 k 005613EB E8 4C5FEAFF CALL SystemCl.0040733C , X! z% v5 [$ {6 b) y 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 , ?! U- S+ X- D7 p. A9 `1 T 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 ' U- `, w! y- b# z$ ?2 t005613FB 90 NOP ; C5 }: D4 X4 p. r8 e5 W程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 % V0 r: L6 I( Q& K- D! e- ? 改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 9 _% X0 M1 `8 D; [4 `, W 是用D7写的,D7的代码特征是 8 V. C* Q3 }6 U5 l. d1 A" APUSH EBP 5 a& R; i, M* H: p9 {MOV EBP,ESP ! i) t9 ?8 A+ {9 y# G6 l# I ADD ESP -10(也可能是ADD ESP -0C) 8 F/ n/ G9 H0 J$ o/ v MOV EAX,****** + g' n% z. O: p所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 & J Z( ^( d5 T- |005613E0 > $Content$nbsp; 55 PUSH EBP 3 u# H' K9 B2 k, f7 l( T9 O e 005613E1 . 8BEC MOV EBP, ESP % C0 C# D. f9 v' E" [3 |1 P8 |' R) i/ t 005613E3 . 83C4 F0 ADD ESP, -10 2 R3 a1 n1 S! m$ C$ j005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 6 [( t% Q+ Q/ B) m) \ 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C Z7 a6 w; \& O# M+ P1 l. E& f/ e005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 % y4 O5 f- ~6 {) e/ V005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 3 X& {5 z+ R, Q' J+ z! O3 @ 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. ) r# o' b1 H4 P

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 20:00 , Processed in 0.417879 second(s), 51 queries .

回顶部