|
作者:jwh51 来自:看雪论坛
* j' p8 [/ X, K0 ^
: H6 `8 i9 q4 ?. d' x新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案.
5 b/ J' }+ a) K9 m h) e+ A用OD载入,BP IsDebuggerPresent,F9,停了下来:
$ F: S* t u& \& E8 x77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18] 8 v+ ~5 `5 r/ u _& g6 }1 I- {
77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30]
7 K" u' j# T# q# V3 f3 K77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] # ~9 d! E- _- Y) w# N ^2 s( R
77E5274D C3 RETN
) A1 u+ c3 H& |. P8 X1 `
; e% u! M y7 O1 |2 n" V9 DF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, , h( x6 b2 J/ M8 ?* e# x+ n
重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 : U) O; m! i' Q, B& I
00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX
# i. R2 ]9 s4 Y3 ~00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0]
# b0 |+ A& [" I' K* v5 X0 a4 s00C23D68 58 POP EAX - X9 l N) ?+ k% P' Q
00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0
7 T6 W4 U. h& N7 `) B& ?00C23D70 74 14 JE SHORT 00C23D86
$ `, B; ?. I \; h00C23D72 6A 0C PUSH 0C
% e, h; H. \% Y$ Z00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC
& o# _8 k/ F; G n) c00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8] 7 }1 k( w# w# B! s: k- A8 |
00C23D7C BA 04000000 MOV EDX, 4
+ X! k. V* R7 A8 S; z* C" v00C23D81 E8 8ED2FFFF CALL 00C21014
" o6 |6 e- Q( C3 R00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] G: Q8 A0 \9 q* v! F
00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] 0 u2 H1 S$ _ [$ r
00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
9 A. g; B& e9 C' @00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0 + e2 c2 ?; ]& F. x& a
00C23D92 74 02 JE SHORT 00C23D96
9 Q" h( \9 u) g# i/ ]4 F00C23D94 FF30 PUSH DWORD PTR DS:[EAX] 4 ]2 i$ o0 C( m; g, V; C
00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
% e8 r1 W& Y* g. m, ^* x00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] : m! o4 \, J$ x& B2 X6 b- d# ~; K: a
00C23D9C C3 RETN
: o" n3 n1 w. f9 X0 v这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下. r0 _ A9 m: L6 K S. i
Address size section contains ! M% ^# S! n: Q: x+ Z
00401000 00161000 code
! f0 }8 t( M8 m' A5 d+ y' _5 P6 r在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这:
$ z* J. i3 Y9 x* u3 }00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] 6 n/ K6 t* y) W2 [7 M9 _3 E7 M
0040727E 8BC0 MOV EAX, EAX N+ s% x4 H- J0 h, E2 H+ t# G
00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328]
6 p8 p4 b0 X5 E2 @% Q00407286 8BC0 MOV EAX, EAX
" S$ p3 A- S7 A, O. p00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324] ! \: p9 M1 ]" K+ [7 G* T
0040728E 8BC0 MOV EAX, EAX
% L6 }. W& |/ J6 i00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320] 6 `7 \5 S5 |3 [& e# ^
00407296 8BC0 MOV EAX, EAX
; i" O2 ?+ u' ~ c: K8 k X00407298 50 PUSH EAX & I+ m: K3 S# R8 H% H
00407299 6A 40 PUSH 40
# _% F- R2 Z! U3 ~0040729B E8 E0FFFFFF CALL SystemCl.00407280 $ w5 V: L$ ]' e
004072A0 C3 RETN
( F) C3 i4 C( ]: @5 {7 x& l这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这:
5 H) ?- e1 W. H7 ^& I! F: s0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000 ) l9 h. `4 m, m% R- c
00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668]
( L5 ^7 C- I1 K# ?" F00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX , X4 {1 A) M e; v k
0040735C 33C0 XOR EAX, EAX 7 E4 }) a7 ]/ X# `! _( N& Q! A0 ?
0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX " j3 F1 f. p7 n3 Z$ o; v8 B
00407363 33C0 XOR EAX, EAX * N4 c0 t& \' F* \3 Y' [1 M7 p
00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX
% W U, p; b5 K2 p0 q' ?2 M5 X0040736A E8 C1FFFFFF CALL SystemCl.00407330 7 [1 Y8 h" [' M
0040736F BA D4205600 MOV EDX, SystemCl.005620D4 ) F0 W) d6 r0 O/ p. I
00407374 8BC3 MOV EAX, EBX % P2 X9 x" Z7 }$ l% l3 \; x
00407376 E8 75D8FFFF CALL SystemCl.00404BF0
% U/ T3 t: ~2 B9 F, j, v0040737B 5B POP EBX ) q2 Y$ Z7 S/ T
0040737C C3 RETN
& g6 N" u) I. X1 a到这里我们要做3件事: 3 w3 g' ~3 S8 m( c4 f/ P
1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 0 d7 C8 G/ ]2 |) g+ G: k
2,记下EBX的值560d08.
/ e) L% V0 j1 X/ i3,先修复好引入表,修复方法如下:
/ {& d1 p3 [# W. p2 [6 Q- z" F看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988,
! b6 T; X+ d4 x6 V( |" G$ }打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE.
% L& U$ ]* X& L- O+ y下面就是修复入口处了.
$ n1 A/ Z5 U3 @. _
5 V X- G6 ?4 k8 Y7 Y5 g回到原程序.按几下F8,过了RETN我们就来到程序入口了. 2 a# j- h. f# Y6 l7 k
005613DF 0000 ADD BYTE PTR DS:[EAX], AL ' n8 R9 M2 r3 s# M( s! `
005613E1 0000 ADD BYTE PTR DS:[EAX], AL ( g/ ]; h% d; M
005613E3 0000 ADD BYTE PTR DS:[EAX], AL
/ k0 O. b" [/ }% e L+ B005613E5 0000 ADD BYTE PTR DS:[EAX], AL 1 n8 N0 o8 s9 K6 k
005613E7 0000 ADD BYTE PTR DS:[EAX], AL ' }0 e% j2 A& r9 v
005613E9 0000 ADD BYTE PTR DS:[EAX], AL # e1 C& j3 @# v: Z6 i* Y, p2 H# f
005613EB E8 4C5FEAFF CALL SystemCl.0040733C ( }" c* g" l! N; e, B1 O
005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0
) _9 R* T5 m0 F, ^0 Y: X/ K9 E- e# n005613F6 E8 BD39EAFF CALL SystemCl.00404DB8
# [" O; y( j" l2 o9 C005613FB 90 NOP
7 [0 p; _1 j8 Z+ Z( \程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 $ ? a0 E$ _2 u% g4 F6 j
改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点
' V; l9 O9 Z% x' _是用D7写的,D7的代码特征是
$ ]" v& T' n$ U8 E% ^2 LPUSH EBP $ h* ~( r& E9 V/ i( U
MOV EBP,ESP * W; `; j# J9 P9 a7 q W# I
ADD ESP -10(也可能是ADD ESP -0C)
8 v1 v g8 [$ u u) c& ]MOV EAX,******
: S( L" J+ z- @5 T- F9 x所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样 2 B6 W& x& b4 w$ d- c5 t7 g2 [
005613E0 > $Content$nbsp; 55 PUSH EBP
: C: D* O( H9 i7 ] v005613E1 . 8BEC MOV EBP, ESP 8 b5 |! B0 f: W# ~
005613E3 . 83C4 F0 ADD ESP, -10 1 o7 \: @, V0 M& n
005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08
4 Z% c7 ~% u* t005613EB . E8 4C5FEAFF CALL jjjj_.0040733C
k$ X- { ^7 `' W! G6 I) Q005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 - w- v5 \4 D5 o0 H# z# _
005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8 # D3 G9 q2 V* g& r, q. w
保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. & E/ ]6 i8 H" H! d6 E, l
|