|
作者:jwh51 来自:看雪论坛
$ d+ T0 u" i" v& D9 ?
; s! h4 J! K( I1 H% e! M新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案.
4 h6 h! ^( r) P- h& I用OD载入,BP IsDebuggerPresent,F9,停了下来: 4 L! D( J: |9 Q8 F5 N N2 h
77E52740 > 64:A1 18000000 MOV EAX, DWORD PTR FS:[18]
7 z* ^. \- A% ?77E52746 8B40 30 MOV EAX, DWORD PTR DS:[EAX+30]
8 g9 V& P1 z; J9 _! P77E52749 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2] - {# p; i% j; [* P1 l
77E5274D C3 RETN
/ m4 b" p( p) w
" H" {( V) O7 o6 WF8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01, . T& {, ?; v- q
重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码 O, n8 N m) f: b$ p
00C23D5F 3100 XOR DWORD PTR DS:[EAX], EAX
# D3 d3 h3 w# v# V' g; w1 c1 F- ?00C23D61 64:8F05 0000000> OP DWORD PTR FS:[0]
% U6 V9 `$ w6 S; f5 l; w00C23D68 58 POP EAX ; Z6 F3 k9 f6 E7 Q4 P( k4 `- m
00C23D69 833D BC7EC200 0>CMP DWORD PTR DS:[C27EBC], 0 4 K& Z7 E' u; a$ m2 m# d
00C23D70 74 14 JE SHORT 00C23D86
a- D$ |+ `7 W! ^+ n$ e0 n! K00C23D72 6A 0C PUSH 0C + w Z# F: w! U* e$ }8 D- b
00C23D74 B9 BC7EC200 MOV ECX, 0C27EBC
- c+ d# E& D) [) X- w00C23D79 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-8]
* O; x. L% f7 L: B& \1 Y00C23D7C BA 04000000 MOV EDX, 4
2 L5 V( C( p% M6 C; k. Q9 V00C23D81 E8 8ED2FFFF CALL 00C21014
& Q3 H8 u1 ` i; [; g* f00C23D86 FF75 FC PUSH DWORD PTR SS:[EBP-4] : Y9 ]$ N' i& }3 N
00C23D89 FF75 F8 PUSH DWORD PTR SS:[EBP-8] + b) P$ s# }- G5 u5 F5 |
00C23D8C 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ' Q( R$ k* b( ^; J" f& X
00C23D8F 8338 00 CMP DWORD PTR DS:[EAX], 0
/ L/ o* |- Y9 Y2 P V4 w1 V00C23D92 74 02 JE SHORT 00C23D96 8 ]- n. P# [. d. p+ Z( U
00C23D94 FF30 PUSH DWORD PTR DS:[EAX] & ~1 ]5 G, Y( F7 S7 x' `
00C23D96 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
& I7 E0 U U9 r, ^00C23D99 FF75 EC PUSH DWORD PTR SS:[EBP-14] $ T* r9 c; j8 k
00C23D9C C3 RETN
4 F# Q) J2 A( e$ N; f. y$ _4 B这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下.
1 q9 P6 _& ]1 U( z# c4 XAddress size section contains `0 ^4 Z9 z/ i
00401000 00161000 code ) i. P. J3 b! l; H# O
在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这: 8 w) i9 D! G' C: O/ D
00407278 - FF25 2CF35600 JMP DWORD PTR DS:[56F32C] + I3 i g, s6 ~1 V2 l n
0040727E 8BC0 MOV EAX, EAX
2 {% N* l2 S. ^+ z1 p; p+ b2 s00407280 - FF25 28F35600 JMP DWORD PTR DS:[56F328] % l% }, d# O7 D% A* J- m! f
00407286 8BC0 MOV EAX, EAX
5 u& t4 H' x R& [6 H4 y+ x G9 J00407288 - FF25 24F35600 JMP DWORD PTR DS:[56F324]
4 w- W% S1 E6 e& v" ?% b6 Q1 a0040728E 8BC0 MOV EAX, EAX 3 F% t+ m& { B5 h% {# P0 I" y
00407290 - FF25 20F35600 JMP DWORD PTR DS:[56F320]
`9 } N: ^1 Q; N& n* e. J+ j. I00407296 8BC0 MOV EAX, EAX
9 G3 X. q1 r) z! P# r5 `00407298 50 PUSH EAX 9 C( n1 c/ v6 u8 J! P2 {* D
00407299 6A 40 PUSH 40
9 |7 O8 ^5 J) Y7 V( v$ j1 @7 L0040729B E8 E0FFFFFF CALL SystemCl.00407280 . H; A, z5 u4 G$ A% M8 \5 j
004072A0 C3 RETN + q) [, ]2 i: Y
这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这:
: X7 ^% o' b# g+ H7 ^9 E! y2 W0040734D A3 68B65600 MOV DWORD PTR DS:[56B668], EAX ; SystemCl.00400000
+ ^. T7 W) P6 B( ]- O2 _; ^00407352 A1 68B65600 MOV EAX, DWORD PTR DS:[56B668] 8 o- D9 P% c* P: z' |: }$ @4 \9 U
00407357 A3 D8205600 MOV DWORD PTR DS:[5620D8], EAX / s4 y" V" F/ @6 x4 |, o4 W
0040735C 33C0 XOR EAX, EAX
$ ^: Z* F8 h D# N3 ~' @' e0040735E A3 DC205600 MOV DWORD PTR DS:[5620DC], EAX
$ a; V: f8 Q# a, {* q00407363 33C0 XOR EAX, EAX 7 u! Q- c4 K. h. ~$ u' e
00407365 A3 E0205600 MOV DWORD PTR DS:[5620E0], EAX
) X7 u9 d7 N0 G, o/ ^, h. O0040736A E8 C1FFFFFF CALL SystemCl.00407330
! r, t- d: [3 D/ i- j4 W( p/ v0040736F BA D4205600 MOV EDX, SystemCl.005620D4
* }, q9 x; l- t( V! e. D+ p, h00407374 8BC3 MOV EAX, EBX & F- u) h6 N4 g4 o( m# j) M7 x
00407376 E8 75D8FFFF CALL SystemCl.00404BF0 1 z0 a9 U. D7 \/ p$ S+ `* W! x
0040737B 5B POP EBX . ?! j/ i( a! E' C: w
0040737C C3 RETN : D4 x& R5 \/ P5 P/ A/ h9 [
到这里我们要做3件事: $ ^7 g2 e% U# O5 O$ a. T
1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE. 1 L n) f1 b w2 |4 x7 |
2,记下EBX的值560d08.
% r& ^' f( W) W* R3,先修复好引入表,修复方法如下: 5 o/ ^, X* _. K3 p- }
看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988,
( @) `: f) l! }' b d7 p$ u打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE.
6 ~7 q% N: [) y7 l8 Z2 h: ]) ^$ X下面就是修复入口处了.
/ F+ Z7 D* l5 u0 [7 G( h; H
d5 _% O( E% `: q3 `% w回到原程序.按几下F8,过了RETN我们就来到程序入口了.
% z3 }5 k* K( G$ k005613DF 0000 ADD BYTE PTR DS:[EAX], AL $ b% M. U! |. T# `- c: m
005613E1 0000 ADD BYTE PTR DS:[EAX], AL
L2 `, a/ x: L" N; @7 Q) ~005613E3 0000 ADD BYTE PTR DS:[EAX], AL
5 u) ?6 H+ m% ?4 B- }* l005613E5 0000 ADD BYTE PTR DS:[EAX], AL 1 \+ s2 |7 S! w9 I- I* f, o4 y
005613E7 0000 ADD BYTE PTR DS:[EAX], AL
. [6 | ~1 \" X! T+ |005613E9 0000 ADD BYTE PTR DS:[EAX], AL 4 Q6 ]0 P& L5 Y6 t4 ]4 U
005613EB E8 4C5FEAFF CALL SystemCl.0040733C
# r+ v- x9 Y" N" J6 m7 u/ U005613F0 FF15 84A15600 CALL DWORD PTR DS:[56A184] ; SystemCl.005608F0 ) I) S/ T+ D; i6 z. \
005613F6 E8 BD39EAFF CALL SystemCl.00404DB8
m* n0 Z, S8 P h4 R4 q: w005613FB 90 NOP
- X) I. f) I: {' V d7 Y程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被 ( f3 H: d$ w4 f* Y" k4 Q6 o2 L2 X
改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点 * @, w5 {9 E5 D( s0 ^
是用D7写的,D7的代码特征是
2 S4 m& g! V& l! ?PUSH EBP
2 I. D$ m- h& o: g9 w4 Q* XMOV EBP,ESP
6 `& i* }# C7 o1 [: hADD ESP -10(也可能是ADD ESP -0C) 2 ~& n/ S4 g; P
MOV EAX,******
; A; i! _* _ M所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样
- A% z8 s& }% {# N: N005613E0 > $Content$nbsp; 55 PUSH EBP " m/ {2 i& X: {, m: l0 ?! B
005613E1 . 8BEC MOV EBP, ESP
3 u" t- @! f: d! g6 N" D005613E3 . 83C4 F0 ADD ESP, -10
2 g3 L8 _% s9 R* \3 E005613E6 . B8 080D5600 MOV EAX, jjjj_.00560D08 , p9 x O1 q" K: N" ?) e4 o" o3 V; O5 B
005613EB . E8 4C5FEAFF CALL jjjj_.0040733C . D. [4 Y; q8 S; t6 _+ f: s- C
005613F0 . FF15 84A15600 CALL DWORD PTR DS:[56A184] ; jjjj_.005608F0 ; ^) |0 ?) R7 W) t( E7 R- l6 w2 \5 ~
005613F6 . E8 BD39EAFF CALL jjjj_.00404DB8
- B4 m% F7 I3 s' Y% D9 ~! q保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成. 1 q L. a( A! x
|