QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

" m0 T9 @, q2 V

/ b& ]; l+ n0 g新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. 8 ^/ @* @" K( u! t( t用OD载入,BP IsDebuggerPresent,F9,停了下来: 2 C1 |$ f d; \; j; Z+ U! q$ B77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 2 T z5 l' j& s+ v: P5 e0 J77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] 2 d3 i# L" c/ D) ~4 V: c77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] 2 U* ?0 h1 Y* |/ N- E/ s 77E5274D C3 RETN / C/ T8 B6 y0 M" @! B8 B/ O5 y% F3 w% @9 l F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, / q0 E0 s3 e1 [: f5 p 重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 7 [& W/ ~1 h3 V00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX # J; o& Y4 P1 P00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] 6 f* \5 e5 h2 _2 h# H00C23D68 58 POP EAX # h- v" Z- Z* ?9 V4 }1 T& ? 00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 0 b9 U! M0 c0 E/ b 00C23D70 74 14 JE SHORT 00C23D86 ; i. A+ {0 y5 N# P00C23D72 6A 0C PUSH 0C 8 b* ?/ f' p) n5 A% y% B0 f00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC $ D4 E3 K3 q9 N( l) i$ h 00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] $ f2 |( X7 \1 v 00C23D7C BA 04000000 MOV EDX, 4 / _4 h% v9 O) r6 z# Q0 N 00C23D81 E8 8ED2FFFF CALL 00C21014 * @1 v r/ |) H* k00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] 8 R* z3 }8 ]; N% z; I00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] . `7 o6 b& x- j3 p6 V- }1 g$ H00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ! ]! H% H6 e8 e 00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 + p5 R& A4 d2 e 00C23D92 74 02 JE SHORT 00C23D96 . B" L+ T; d9 J! W: [ 00C23D94 FF30 PUSH DWORD PTR DS:[EAX] % y" b- R" R, Q9 {. K 00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] * t$ O/ i q! R; K. x" ]( _0 `00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] 2 ?. T5 k1 f" _ j0 e 00C23D9C C3 RETN 1 E) y% v2 A4 F/ H 这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. . C9 f$ J! K$ ^2 l1 BAddress size section contains ' p) v& |0 b* \ a3 `00401000 00161000 code ) P# T4 T; T9 o. @* @& i5 n5 L在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 3 u/ c' d, a! F. H: w$ t. c00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] % W6 D) X5 V9 Q4 S( f0040727E 8BC0 MOV EAX, EAX * T" W( Y1 C& q r: p3 h6 H& B00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] 7 V8 ] j2 I {( n: y* |6 r' H6 c 00407286 8BC0 MOV EAX, EAX / [8 A0 |+ z( @& k00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] ( N+ B7 L$ @8 U6 N# w* y# m 0040728E 8BC0 MOV EAX, EAX ( ?' {8 W/ o/ i) X$ u3 H. S& X 00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] . s' P( d7 m0 s% v( n4 ~" {8 O00407296 8BC0 MOV EAX, EAX 0 d2 u1 _ ~* N% u0 O' G 00407298 50 PUSH EAX # F" F, D8 p" ~+ o 00407299 6A 40 PUSH 40 * S+ q7 P0 p( ]2 Q+ D0040729B E8 E0FFFFFF CALL SystemCl.00407280 ! g. [0 P1 ^- n4 G: G! T004072A0 C3 RETN , Q& ^9 [* J7 y9 ]: i7 z 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: 0 w" D3 |5 P8 T6 V! |; m* y. t- A0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 $ b" i1 `# r% g0 z2 |00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] : E" a/ ]4 p5 [7 o9 V00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX & I/ L. n# m! B, H: x0040735C 33C0 XOR EAX, EAX / U0 y& e, X" N8 e1 u/ Y0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX 1 Y6 M" w5 b" K( Q! Y% c 00407363 33C0 XOR EAX, EAX * k5 n& R% V+ J4 p4 X# f0 j1 z4 C# X00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX & M) S+ H7 ~2 n6 c 0040736A E8 C1FFFFFF CALL SystemCl.00407330 ( }! ^9 [ D) B! x$ G 0040736F BA D4205600 MOV EDX, SystemCl.005620D4 ; Y% z3 y) W' A7 Y0 D5 Q00407374 8BC3 MOV EAX, EBX f/ N! @3 c7 z! L 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 ( A! s6 l6 o. P3 Z/ H! w/ A0040737B 5B POP EBX 9 u0 |! H% S* s( I 0040737C C3 RETN T1 s5 P( X- g! h5 S) u3 ~到这里我们要做3件事: " u4 e- ]; J1 d; S) ? 1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. ( v# [: q6 Q- f0 h; t( i# @! | 2,记下EBX的值560d08. / e0 w) s3 F- B' D e3,先修复好引入表,修复方法如下: , \; t1 p* w! n1 j+ R看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, ( c1 u; D) Y: l! ^3 Y# C, r打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. ! ?$ J# i/ `+ g$ o) G- C7 o& M 下面就是修复入口处了. + }" F6 S" M1 d' y6 g6 W" A1 `1 V) P1 o' A) R/ B% g$ t' V% V! Q 回到原程序.按几下F8,过了RETN我们就来到程序入口了. ! l1 S5 n- R" C/ k" h005613DF 0000 ADD BYTE PTR DS:[EAX], AL 8 i2 J& K5 x2 o3 M# j% H 005613E1 0000 ADD BYTE PTR DS:[EAX], AL % D9 a6 ^; K# O0 K( z3 O2 V3 L' Z2 y005613E3 0000 ADD BYTE PTR DS:[EAX], AL 9 Y) u4 f: B" e$ q 005613E5 0000 ADD BYTE PTR DS:[EAX], AL # X$ [ }( o' }; J! T005613E7 0000 ADD BYTE PTR DS:[EAX], AL % u! p; r# x' p0 f7 n 005613E9 0000 ADD BYTE PTR DS:[EAX], AL ( s( c6 j: w5 S! d: \& Q1 H 005613EB E8 4C5FEAFF CALL SystemCl.0040733C ; C' \) y1 b0 G0 K6 R: v: s 005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 ' O4 ~- V7 y9 _3 t; J6 |8 J' P' H& u 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 7 V, P- p: {0 Z$ x& V& m: O 005613FB 90 NOP 9 F' w" ^3 x, }+ x# a程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 8 k0 B1 T' u6 v& u9 @: t 改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 $ n8 D5 ^! M/ W 是用D7写的,D7的代码特征是 0 a$ u" F3 ~/ u9 ~4 YPUSH EBP . W, f1 `$ Z* @ MOV EBP,ESP ( Q' c5 l# |- @! K' h7 }+ y, Q9 B ADD ESP -10(也可能是ADD ESP -0C) & D) {) ~& P& }2 F+ m4 YMOV EAX,****** + p: O7 A" m8 n# C1 z* h' @所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 ) R0 Y# ?( m# J005613E0 > $Content$nbsp; 55 PUSH EBP 1 U) J: n7 ]# g* `% H 005613E1 . 8BEC MOV EBP, ESP # b5 E. Z) C. `" D+ E005613E3 . 83C4 F0 ADD ESP, -10 3 s' }+ f( J n2 b) a 005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 3 |$ M: R+ D: F005613EB . E8 4C5FEAFF CALL jjjj_.0040733C " {. U4 ]4 l7 n! v' g* a 005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 6 j; v9 v8 c; A2 `( U, l+ y 005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 7 g, B5 }5 ]# ~& f, {" ? 保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. . _: N2 q5 C" Q c: H, ~5 g3 m6 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-8-30 18:39 , Processed in 0.642200 second(s), 51 queries .

回顶部