QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

作者:jwh51  来自:看雪论坛

* v8 A+ T. V: P6 H

" {* G: i$ e5 ~. M新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案. 1 X" e& ~' K Y# p 用OD载入,BP IsDebuggerPresent,F9,停了下来: : Y: {: }1 T l! _( I77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] * b/ N# l* K6 {: V- k8 Q4 p 77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30] , P1 J# V5 [( v0 S77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] 3 Q$ W% z+ [! l$ |/ L8 ]% z77E5274D C3 RETN " ?. i) L" N" f% q+ k4 |2 W7 C9 j9 u- d& |+ v F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, ) {0 g9 _0 `9 L* [/ z \ 重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 - A T H! @* B6 _$ f7 X 00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX 0 X, v' i# E2 F8 G/ s7 n) ~/ M 00C23D61 64:8F05 0000000>OP DWORD PTR FS:[0] % L3 I$ [9 h" X# |9 [00C23D68 58 POP EAX 0 b% s/ s4 Y9 R O00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 u+ V+ N& I3 _% K- b; Q00C23D70 74 14 JE SHORT 00C23D86 * Y F5 G; Q5 h0 K! H00C23D72 6A 0C PUSH 0C 1 a; C1 N- u$ [00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC # X4 Z% T/ g, r# l W% o00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] + f6 w% T% i% t' d: t 00C23D7C BA 04000000 MOV EDX, 4 / M% `3 O: p8 {! X4 f' `' k 00C23D81 E8 8ED2FFFF CALL 00C21014 4 U$ p) Y, v/ o' S% Y6 v: H00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] $ t2 L+ d* G7 C00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] : S0 p+ `$ q6 N5 [& Q 00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] 4 I( [! g [/ j* R* h% k4 i00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 1 A6 [* ?: d- j$ N00C23D92 74 02 JE SHORT 00C23D96 3 W+ n; I9 Q- e% ^00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 6 O0 T' c& s- n00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10] ( R# v2 a: m/ P' u* L( Q 00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] / ^, y) P* g) ^" ~7 G 00C23D9C C3 RETN , q/ x- g e$ b# Y( E这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. 8 n" I/ i* E4 u$ b Address size section contains 1 D; N- y& e Q( _" l' E+ @( Q+ g 00401000 00161000 code 0 p" t/ L* | v @. |3 d+ ~8 c' M在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 3 s5 p1 q' ~) t& M00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] 8 \ \$ d& l$ _9 o% W" p3 Q0040727E 8BC0 MOV EAX, EAX ) N* }1 k5 f0 c+ {2 w2 D! B8 b 00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] 8 N/ m1 e3 m. t j00407286 8BC0 MOV EAX, EAX - U/ S7 p. `8 ~0 _6 d 00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] : ]% v T- [1 O) j9 W3 ~, e1 R 0040728E 8BC0 MOV EAX, EAX ' N# }1 M8 M3 }" T4 k3 L 00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] ( b1 y8 q, H6 ~$ H W 00407296 8BC0 MOV EAX, EAX 2 X7 H3 i2 |& E* K00407298 50 PUSH EAX ( c5 G& @# ]" P- i" H" y+ j 00407299 6A 40 PUSH 40 1 V! R1 i! ]0 P: b( a3 p: e6 E0040729B E8 E0FFFFFF CALL SystemCl.00407280 : K# f: d: _6 M- U 004072A0 C3 RETN 0 ?/ z# N& M" Q. m7 w 这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这: ' i7 U3 u2 `4 _ `- t0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 + I, z( m" ~ y# P00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] , K' N6 ]. U8 \' K00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX p& \3 E. r2 L1 |6 Z Q0040735C 33C0 XOR EAX, EAX |* U3 d9 i/ h* k0 ~ 0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX " W. G1 _( ^& t2 S6 `/ b/ { 00407363 33C0 XOR EAX, EAX / ]0 K* D% ^# |( ? 00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX ( b+ j% d9 w. j2 ?. a- D 0040736A E8 C1FFFFFF CALL SystemCl.00407330 1 n% {* Z$ b1 o6 n0040736F BA D4205600 MOV EDX, SystemCl.005620D4 - z' I3 H) E* w/ v& X 00407374 8BC3 MOV EAX, EBX 1 B. o+ W3 n3 b! r 00407376 E8 75D8FFFF CALL SystemCl.00404BF0 + }" @9 M+ T0 z, F! d0040737B 5B POP EBX ' H5 e. M: d8 ?) ~% a0040737C C3 RETN - |% `2 W# t! O- I2 V 到这里我们要做3件事: 6 r( h- u8 x% H2 G) Y" l 1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. & h3 X1 g( E! D8 L; j4 O# w( Q2,记下EBX的值560d08. * d5 R4 \, p* c. w0 T, h 3,先修复好引入表,修复方法如下: 8 k; a3 U& k& V$ H% d看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988, , o& N1 |7 _$ U. I; L! [ 打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE. 1 Q& B( i* Q- N0 r9 M 下面就是修复入口处了. ) Z+ k4 ~$ l% i" k, Y + P8 t" }' d! ?2 W l4 E回到原程序.按几下F8,过了RETN我们就来到程序入口了. ) j* v* P! F: b# D) u+ }% ~6 K4 Q$ ^ 005613DF 0000 ADD BYTE PTR DS:[EAX], AL % [% S0 e2 h3 }' d' G, I+ U005613E1 0000 ADD BYTE PTR DS:[EAX], AL : W: ~7 }: W/ N3 J9 L( v0 A 005613E3 0000 ADD BYTE PTR DS:[EAX], AL $ P& m Q5 G$ o8 N1 x6 U# s005613E5 0000 ADD BYTE PTR DS:[EAX], AL 2 {$ w" E4 e; h005613E7 0000 ADD BYTE PTR DS:[EAX], AL ) b- ?; A$ I' D5 h- v005613E9 0000 ADD BYTE PTR DS:[EAX], AL 9 G6 _% t2 A- I- F 005613EB E8 4C5FEAFF CALL SystemCl.0040733C 6 |( H( i( Y0 U: y; J; h! s005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 1 d6 Y2 y. E$ ^+ r/ z8 o 005613F6 E8 BD39EAFF CALL SystemCl.00404DB8 - F+ O7 A8 H2 f, z3 W005613FB 90 NOP 8 K7 W' y! Z4 {; T+ J' u程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 : n' t4 n$ O5 K! q( ? 改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 ; T* U5 B' z* x3 e+ O5 P& R3 ` 是用D7写的,D7的代码特征是 ' b1 F# L$ `9 R6 ? _) Z2 qPUSH EBP 4 P, u9 [* x, k, D MOV EBP,ESP 8 z. }. G, e+ Z6 ^ ADD ESP -10(也可能是ADD ESP -0C) 4 \2 V: G, }& n9 @3 H MOV EAX,****** + n; M, A' d7 T8 U. j 所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 ( g/ ^- y) u7 _' n# b& [7 X005613E0 > $Content$nbsp; 55 PUSH EBP ! L5 K0 p% J: k 005613E1 . 8BEC MOV EBP, ESP 6 M' j) w- b7 j005613E3 . 83C4 F0 ADD ESP, -10 " K4 {; f! v0 S" m005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 $ C8 t2 f% f: P* n+ [# R# m 005613EB . E8 4C5FEAFF CALL jjjj_.0040733C * N) q: ], T3 K+ S8 Q. G& m 005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 3 r$ ?2 Q ~5 V' \; K- \7 L005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 9 b5 R3 b, k# D保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. " y3 a0 @* \( i8 C$ ^7 }# U: O; _

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 21:30 , Processed in 0.391503 second(s), 51 queries .

回顶部