QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

3 h- C' ^0 k H6 L% `: z

* _" Y0 C' |/ m3 ]0 i 新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. * m( Z5 n2 J6 c, `7 g 用OD载入,BP IsDebuggerPresent,F9,停了下来: * R6 ]: E5 E* t" h77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] ( Q9 f( j* i, ?) G 77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] 2 E5 u8 _4 R J' F" K 77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] : Q; [. x K# f5 d9 ]3 p: a 77E5274D C3 RETN % L9 [7 r3 K: J0 m2 [ + y) f6 {; O2 O4 z% N; P7 a% SF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, # |, D6 i# U x( S2 G* A重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 + T4 Y4 F( Y# L X 00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 8 T+ [# j/ V1 @# N4 Y00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] / X6 [" {- n8 T# z( n00C23D68 58 POP EAX 2 q* M. _/ q- X& ^7 K0 A( A 00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 & a% F; ]. y, F7 z00C23D70 74 14 JE SHORT 00C23D86 : B% r, {- C, d$ U) o5 t00C23D72 6A 0C PUSH 0C 1 y: Y: ] D0 u- b( W8 |# u; N5 `9 k 00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC # n) S I7 k5 N! c. K4 E00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 5 q2 z4 ~3 j9 N0 W: p) M6 V00C23D7C BA 04000000 MOV EDX, 4 3 m4 L; j' ?' k% ] m5 \( S. a00C23D81 E8 8ED2FFFF CALL 00C21014 6 Z! `4 Y( @$ _" G7 F/ q) X 00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] * P2 o9 A# ^8 r9 ^ 00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] / o3 ^$ X7 w5 K& v! c# b 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] 7 V% U7 w+ w2 _3 \00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 9 _1 j/ J& [% p( R' M& v9 V! _+ X) v00C23D92 74 02 JE SHORT 00C23D96 4 y9 P8 _# }% K u. X8 U, I( c0 p( l+ R 00C23D94 FF30 PUSH DWORD PTR DS:[EAX] ! y) J" r) u5 K7 B( v 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ! `. k1 X$ C, u* ^2 e) A 00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] ) y A$ ^, ~! F4 c 00C23D9C C3 RETN ) ` w/ K* c, K/ h这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. ) y) z$ t2 g, @" `- u* \Address size section contains " ~' b+ o9 X- R 00401000 00161000 code . v% O- G R& n- y8 I 在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 7 n7 |% `) K; p5 G% B 00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] : z( |, F: M( B0040727E 8BC0 MOV EAX, EAX " }& P; I; k+ g' G# ^00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] & S( Q" S; j, r2 } 00407286 8BC0 MOV EAX, EAX " G) W3 G# f" s* {00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] ! [+ D* F; s! K {0 g& ?3 g) |% k, U0040728E 8BC0 MOV EAX, EAX A. ^; [# k% m# h; V00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] , _) @/ ^: B; j 00407296 8BC0 MOV EAX, EAX ! I+ U1 g# l) _ E& ]/ h 00407298 50 PUSH EAX $ J% a; P4 n3 [! ?% V- s+ a00407299 6A 40 PUSH 40 # s! s* s8 R i: x, R1 w0040729B E8 E0FFFFFF CALL SystemCl.00407280 / k6 {0 D3 Q$ E0 A" {- V. N 004072A0 C3 RETN 9 P) t2 c/ ]! V$ p. X这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: ( B m. i4 I1 \' A8 ?7 X% {+ M2 z* |% H 0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 2 v& @) O' c# v8 Q00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 6 X1 D' [6 ^( y% q' z8 U00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX 1 n2 z* W' I, K- x% o0 S3 u6 X0040735C 33C0 XOR EAX, EAX $ }$ P7 i. M. f1 b7 K x5 e0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX # `9 [6 X% A* ?. L, u: B00407363 33C0 XOR EAX, EAX " ^6 B! b+ ]: }3 u$ F 00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX & t' i+ d+ V9 C% {0040736A E8 C1FFFFFF CALL SystemCl.00407330 $ K5 a0 K2 j8 F7 W: z5 C$ n2 h0040736F BA D4205600 MOV EDX, SystemCl.005620D4 / h# n0 n" I8 x! I8 x1 _& k+ ^ 00407374 8BC3 MOV EAX, EBX ) H0 O0 t- ?& R; r0 q00407376 E8 75D8FFFF CALL SystemCl.00404BF0 7 _5 g- d. H; u b 0040737B 5B POP EBX 6 ?) U/ p" B4 n: u, r; C y8 T0040737C C3 RETN 6 Q, g7 s) T9 d0 ^! K 到这里我们要做3件事: 8 v) W6 T, A+ y! E f8 s 1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. ; Z$ w& P6 a4 ^% @0 A! a6 z; s: ] 2,记下EBX的值560d08. . s, U' b# r. e7 [, S; t) P 3,先修复好引入表,修复方法如下: ' a6 r: ?" m1 E, E 看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, 8 R2 G( r, \/ A0 H& G( A# U0 `打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. 4 j y* R% R+ B/ ` 下面就是修复入口处了. ; }! r/ {; E$ k # J- ^/ Y& D& X" l7 I _. f回到原程序.按几下F8,过了RETN我们就来到程序入口了. $ c% l# Q8 `) w- ?4 K4 L; M 005613DF 0000 ADD BYTE PTR DS:[EAX], AL 8 \- e1 _9 c, p! ^9 D- z! P9 ~ 005613E1 0000 ADD BYTE PTR DS:[EAX], AL 7 v& d+ }- K5 g005613E3 0000 ADD BYTE PTR DS:[EAX], AL % ?( b: C! i; L" V8 I005613E5 0000 ADD BYTE PTR DS:[EAX], AL a. K9 w/ i$ z1 N% [" r% \' J 005613E7 0000 ADD BYTE PTR DS:[EAX], AL ) p9 V1 i8 ]; Y i 005613E9 0000 ADD BYTE PTR DS:[EAX], AL : B! m7 e/ K o' i% B/ B: ^6 l005613EB E8 4C5FEAFF CALL SystemCl.0040733C 6 N. ]/ A5 a8 s- a' c' q 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 $ x% i# {, N" p2 R8 O& j. d# E005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 0 p1 C& |: O3 c2 g; o3 o2 k 005613FB 90 NOP 8 r# x# _- [6 w9 {8 i6 n: X 程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 ! U. J% {' f# t! j 改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 % e. B! S8 `& \1 J1 D 是用D7写的,D7的代码特征是 9 X2 j5 x0 X: ?2 V$ M, a4 Y PUSH EBP 6 Q+ L7 U' T1 q MOV EBP,ESP - o3 X! ?1 k9 N5 |0 k% CADD ESP -10(也可能是ADD ESP -0C) ' o; f" V3 w3 a4 uMOV EAX,****** : I `. f( O7 c$ ?; [ 所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 % T& Y( \- i: X& P1 |8 W) T R 005613E0 > $Content$nbsp; 55 PUSH EBP 7 N" B6 g3 U6 h 005613E1 . 8BEC MOV EBP, ESP + r+ Z9 n" \5 F; z005613E3 . 83C4 F0 ADD ESP, -10 : z' j. n% w* z$ N! \ `* o0 L 005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 " O6 }9 C1 J2 s* T8 Z q005613EB . E8 4C5FEAFF CALL jjjj_.0040733C 4 n% V5 Q/ e7 ~* k* w/ Q 005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 * h4 J0 |8 B* b$ j9 u005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 ! b/ s K. n1 l: S: b9 A保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 2 Y# W) g: z# L1 v' e" `' K N, y

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

回顶部