- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
|
作者:LaBBa
5 L5 K8 r! L% C; y% F, J2 N1 V翻译:gmh001
: Y4 b- x; v) b9 V7 ~. \软件: System Cleaner 4.89 Build 110
+ j* ^3 p3 s) m/ ]' Y" a m5 ]9 ]# CUrl : http://www.allerasoft.com/products/systemcleaner/
) q6 H) i4 c8 \8 O
6 l' ^- U' o4 g& h前言5 P% f4 Q$ {. p- S I! h* G% g
==================
3 y6 r. G( G2 x, \* lOK,贴上来!!这是我第三次写这篇破解文章,第一次正在写的时候机死机了,第二次停电了。
- ~0 i- c+ \9 N; S! }; {1 q% ^(呵呵,运气有点背啊…)
4 {( c4 k* R0 C8 h4 R. K' x6 w现在… 4 k& Q' j3 d& |; u6 z
& t1 ^, m' f7 w9 T) B2 V, Y" d" m这篇文章讲述如何真正快速简单的脱掉ASPR 1.3x的壳,并且找出被抽掉的字节… ' o( i+ s! Y. d& Y% A+ x5 V. a
并且不使用SoftIce、IceDump和 /tracex!用什么?使用OllyDbg !9 _2 m; Z l( g/ ~5 P
: P) T: c; O% Y/ C+ Q7 }* p
所需工具2 j: X F5 a7 f0 g) Y/ @. X5 L8 I
================
( h+ ~9 }) U8 e8 H8 b1. OllyDbg 1.09b2 or newer
* d6 W+ ^" r' t: [2. ProcDump(G-rom)/Pe-edit(y0da)
0 X4 g1 e5 X- l5 o7 b* z4 i3. imprec 1.3 (MackT/UCF)(protools.cjb.net)
$ v/ z4 p3 Z- p4. HVIEW / Hex Editor ! s* W) I1 C/ l# U3 D E6 ]
3 |1 R5 F5 p6 S! T脱壳步骤
; H2 k- k% b" Y+ O) g1 O: z=======================
& @2 y/ c% B" \( p1. 找到 OEP+从内存中抓取程序 7 v& I$ I7 j* X
2. 找到抽掉的字节 0 X; W7 r. u5 T; J( v- \# W* x
3. 重建IAT
4 B9 b( V8 n* q: w4 ]4. 修正OEP
5 {6 W# Q8 J! j8 g: A! x1 D- l5. 结束 , @8 U* j r! s" Z) U( z* L5 T/ h
, A! o0 C) s( s
5 u5 J X6 Y3 R9 B==================================== ' f6 x! J8 |) ^: j
第一步—找到 OEP+从内存中抓取程序
r% d$ f* j+ [. w& n' w8 J==================================== # _' O5 G4 O/ L5 a4 B9 p
2 P- |6 ]: W0 ]5 }3 v2 v& t2 a
1. 运行Olly并载入应用程序(如果有提示就按 YES!) 8 X, b# Y5 S2 z
2. 现在按F9就会在这儿中断:8 I$ L- C0 e% A: _. O) C4 K
1 S6 E7 Z0 M; }# l0 r# J% P( r 017E3414 3100 XOR DWORD PTR DS:[EAX],EAX 〈-我们在这儿中断!
6 Q1 g) Z. r8 e* T! i5 v" b( ~3 X$ U 017E3416 EB 01 JMP SHORT 017E3419
# A0 m& E5 S n5 ?8 j! F; M1 @ 017E3418 68 648F0500 PUSH 58F64
# ~' q' F4 y2 @" ?$ }7 Z! N8 ~0 x" N4 U3 n: q
为什么Olly会中断?我们不用设断点吗?! - y0 m9 g% m# w3 J
呵呵,Olly在每次进入一个新模块时都会中断…我们将继续使用它!! - o/ d6 V$ A0 z, e* M/ T
% X% D7 b- k6 J7 n [# b0 C3. 按Shift+F9,这样Olly会继续运行直到遇到一个新模块。 7 G" |* X0 v2 a7 t* {
4. 按Shift+F926次后我们将到达这里:
" O3 }9 l6 u9 z
& h! M9 U0 @6 t0 F$ F3 C5 o- S4 l 017E2D7A 3100 XOR DWORD PTR DS:[EAX],EAX〈-我们停在这里
# l4 O2 V8 Y5 Q+ u' X S8 f! j 017E2D7C 64:8F05 00000000 POP DWORD PTR FS:[0] 〈在这里设断点 * M5 e% B( s$ Q" {7 A1 i
017E2D83 58 POP EAX
) A7 _1 Y! @! t3 w2 O' `. } 017E2D84 833D 806D7E01 00 CMP DWORD PTR DS:[17E6D80],0
; @( O1 w& c0 \3 Z9 m* h1 i, X 017E2D8B 74 14 JE SHORT 017E2DA1
# g) r/ D; ?: Z V 017E2D8D 6A 0C PUSH 0C 7 e& s" H, S, e
017E2D8F B9 806D7E01 MOV ECX,17E6D80 + y* i7 n t! e2 ^' X6 K8 I6 _) _
017E2D94 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
" l0 W1 Z8 y, {6 T7 t; f1 {, T& @ 017E2D97 BA 04000000 MOV EDX,4 5 Z6 @- L6 z0 f1 E1 V* r! |
017E2D9C E8 EFE0FFFF CALL 017E0E90 $ Y/ x- {3 b: G) O- V6 T
017E2DA1 FF75 FC PUSH DWORD PTR SS:[EBP-4] , Z q: X8 y+ @1 k
017E2DA4 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
, m5 e ^" z- L 017E2DA7 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
' R+ q( k& E" |) k/ H 017E2DAA 8338 00 CMP DWORD PTR DS:[EAX],0 ; V" h" [; f% G4 [
017E2DAD 74 02 JE SHORT 017E2DB1 " D! ]/ e8 Q( m
017E2DAF FF30 PUSH DWORD PTR DS:[EAX] ~- y; ^: Y8 R
017E2DB1 FF75 F0 PUSH DWORD PTR SS:[EBP-10] & g n8 I: G1 ?1 p
017E2DB4 FF75 EC PUSH DWORD PTR SS:[EBP-14]
' B9 {. G, j1 e# C# i 017E2DB7 C3 RETN ) A' S8 S- u# C( b. t1 G
0 m. f% G+ \, S2 B" F如果我们再按一次Shift+F9,软件就运行了…千万别这么做!!
. i) c9 w C' N" @ R x# s1 S6 `; x1 Q
5. 现在我们向下移光标,到这里: ' t, f7 a7 Q9 ]0 O9 E
; ~* J( @. {7 i! D2 [, Y _
017E2D7C 64:8F05 00000000 POP DWORD PTR FS:[0] 8 a8 O7 i) [9 O% E8 {* I5 z8 D X( a. M
* S+ }% n) i( g按 F2(设断点)。 ' \. ], \6 |# i: M: Z6 V+ J9 {
再按Shift+F9,Olly就会在断点中断。
9 N; @6 y( I- E$ o# [
) E& H5 B( h7 R& G X6. 现在按F8单步追踪,执行RETN将会到达这里: N2 A$ B, g B2 f! D& `/ @% U9 g
3 F" ~' e. \" I8 W
017F4EC8 E9 080A0000 JMP 017F58D5 〈-在这里
, ^! ~" C7 h4 j 6 N# U! W2 I. q. F" G8 j$ V5 e$ ~
按F8执行这个跳转…/ x# i" ?$ Q. ~6 i
现在我们来到这里:
! R, l5 `% j9 i# i+ \- v0 O$ X 017F58D5 D3DE RCR ESI,CL 〈-停在这里
: h# o: i6 W4 f* K* V* r 017F58D7 B9 7D966271 MOV ECX,7162967D 3 J" x7 b& v& ^$ m( E7 t6 G) n1 A
017F58DC 81C1 38F10A23 ADD ECX,230AF138 ) b* \% @5 r0 x4 h4 {
017F58E2 D3EE SHR ESI,CL ' u( `3 {# p/ k1 |9 g2 S3 K% X
017F58E4 BA 9ECC7376 MOV EDX,7673CC9E
& \8 K; L% H* N 017F58E9 81EA C56EFFD4 SUB EDX,D4FF6EC5
" d1 m& i9 {) x! T, D6 a 017F58EF 81F2 B7104902 XOR EDX,24910B7 5 p+ v* O/ k1 u' v1 J% Q; h
017F58F5 C1CA 94 ROR EDX,94
p2 B+ `4 \3 P+ j1 c6 n; \ 017F58F8 8BF2 MOV ESI,EDX : D! |4 r) Z0 f, j$ F. H6 c* b
017F58FA 81EE 87D851D2 SUB ESI,D251D887 + H, i9 V9 z* W9 ^8 I
017F5900 C1CE B0 ROR ESI,0B0
$ }/ t$ j- |7 @. f$ i) q p/ G 017F5903 8BC6 MOV EAX,ESI
. @% W- Q* Z* N# |& B 017F5905 C1C8 28 ROR EAX,28
t/ [/ {* E7 @) R& H+ }! k! N 017F5908 53 PUSH EBX 8 p9 ~5 G0 Z2 X( I! P
017F5909 5E POP ESI
' Y) N7 d8 f, J1 ~) q 017F590A 81C5 974FAF73 ADD EBP,73AF4F97 1 p1 M2 U% I1 [4 x
017F5910 BA 048A9178 MOV EDX,78918A04 3 Q$ q3 G8 d! k/ P8 T+ M3 b1 q) m. V
017F5915 F7D2 NOT EDX 6 t' z% b% [# |0 o9 N% v+ o
017F5917 F7D2 NOT EDX
4 \+ F. [; i/ R. p" M0 H- b! r, {) I5 I3 t 017F5919 81C2 FC756E87 ADD EDX,876E75FC
3 k/ a. x! [- X2 w1 U7 V' b7 I 017F591F 8BDA MOV EBX,EDX ' o2 A9 j M# l6 D" e- j
017F5921 41 INC ECX-------------------------
% S8 {( t# u! y) O3 [6 ^! n 017F5922 8BD9 MOV EBX,ECX | , l6 h1 O: G, @2 Z. p9 j3 y' C
017F5924 D1C3 ROL EBX,1 | a Realy Long
/ E9 J' p6 E7 W! H& v$ i- {* h3 p+ Y 017F5926 81F3 A38FD7AC XOR EBX,ACD78FA3 | Loop ' b" [4 |4 a0 }! x
017F592C 3BD8 CMP EBX,EAX | - S7 g* q, l3 y# \) {+ k+ {
017F592E ^0F85 EDFFFFFF JNZ 017F5921-------------------- % M# v: ~' b9 v, g3 |% ^- M- O# Q. W
017F5934 8BC1 MOV EAX,ECX 〈〈-在这里设断点!!
, ?& o2 ]' H! L3 s* y I$ w
6 K6 I* S3 ^' x8 H* f7 A好了,我们可以不用通过按 F8 来追踪整个循环!!我们在下面的指令上设一个断点:
- ]& P4 W. C# Q% ~0 u
# J; m: T9 S. W" E7 q8 _% s# Y 017F5934 8BC1 MOV EAX,ECX
8 y' Q. k/ u7 }/ p% J* `
$ N5 N' R7 T9 K* g6 \设置断点后(F2),按F9(运行),将会在断点上停下来。
! m, _3 w1 w2 V2 P5 p; W3 e9 X
* \$ e- ?# g0 o7 T7 w3 d. Q, b7. 为什么??总是用F8 / F7追踪??!!
& K' Y9 b( e0 @3 u% Y+ H* |好吧…不!!
5 H* c' i G* Y( K+ i4 H, DOlly里有一个很好的功能:调用命令行。 * m) r6 L( g% b8 T1 F, D+ V6 \
从菜单里选择:Plugins->Command line->Command line
3 j$ j( g4 m8 k* @, \& R+ r; Z- d! |: W f5 ?* M( Y: p* X0 G
现在我们将写一个条件追踪命令!
! }+ v2 R" ?6 j$ o2 h: SYES ! Olly有一个追踪命令!它调用-TC-条件追踪8 }. G* F; E* R
它将会在条件表达式为真时中断! 6 g' k K2 j' l. x% x
, G- w4 X! @6 k
这样…在文本框里写入:TC EIP<900000
# J0 T) t7 a( @1 q& j按Enter键。
# I, Y- m$ D5 H+ B" U0 u在窗口的右下会出现:“正在追踪” ( a8 `3 y& o( C$ i
' @# T! f$ _1 Y/ U1 k我的机子慢,花了大约8分钟(350MHz) + | o! n \* ]
在另一台较快的机子上花了2分钟多一点(900MHz Celeron)
$ B9 y& n5 X' Q5 p2 g, E' I: ?0 l# Q) L: j X: ?
8. 追踪完成后中断在这里:
8 K- b# t. z `9 g u/ B! w
$ L( O: S+ k* X* \; E 0057EA5B E8 DB E8 - A3 m. Y1 W- o6 @: a
0057EA5C 00 DB 00
% L& `- I; w3 r+ n' N' [! y, R 0057EA5D 8A DB 8A - y( [3 _" L' l
0057EA5E E8 DB E8
7 ^: s4 u% U* E! t% j 0057EA5F FF DB FF
+ ~! J0 v( D, f$ s( g
! q0 L# W, M0 h. J f嘿!! i Dont See Shit !!这是为什么?! : H! a7 C- Q0 a' x
噢,Olly没有分析这段代码,实际上我们并没有真提停在OEP上! - x9 D' g" `1 N9 H( y% s
OEP=57EA5B
" h5 @; e+ Z0 x$ ^/ Y y5 X6 C9 u# D
9. 重点!! 在OEP处看盾EAX值(CPU窗口的右上面)
- _6 \5 W2 X; G! f) C0 k2 e0 [EAX=57E318 9 z. _2 U7 a/ O4 ^" O$ I( D, v& ^# L
记住它,以后会用到它的。
; a, d( T6 E3 ]: g9 j# b6 O8 I
# w$ m0 g* Q8 G- ]6 U! q10. 打开 ProcDump/Pe-Edit,完全抓取进程。2 H) P8 r+ Y2 h: P1 m+ ^# |% ?
: W4 b7 l( C8 B* x8 z8 [% P
=================================== % T4 v3 H$ c9 c, ~+ l
第三步-找出抽掉的字节= 3 r/ v9 `! m& J9 }
=================================== " P, e: j( X# R9 a
, K' p9 T8 D% {( h$ a找出抽掉的字节有三种方法:8 F7 T3 g @/ Y
/ c9 L& L2 ^( v8 d2 }! g) _1. ASPR会执行抽掉的字节,象下面这样跳转到OEP:
6 G5 z+ @3 s! D# A. \+ ^ R
* V2 q; p c7 L3 J7 ~! Z# k Stolen_Bytes_1 / @* ^, R0 m9 ?: V5 Y
Stolen_Bytes_2
8 l6 T/ S) r x7 \6 S5 e& g! ~ Stolen_Bytes_3 , h" y' b0 w6 T E/ x6 O
..... : e6 U! H c4 I4 H
..... . O+ }' T: W* G' |0 `
PUSH_THE_ADDRESS_OF_OEP " S4 p' A3 V; Q7 N' h$ K: c: _
RET_TO_OEP
6 c4 f1 _" F1 a1 M' X( R1 G" R* q$ K- {/ n% b- F
2. ASPR首先保存抽掉的字节,然后从OEP处还原,再象下面这样跳转到OEP:
. L- I- k! m9 X4 F+ w2 y4 Y z8 ^8 o B! S0 a
Stolen_Bytes_1
' _8 V& s! [1 H6 _ Stolen_Bytes_2
' P( P; G( d X" R/ b7 ?. q( ? Stolen_Bytes_3
: R9 S% m) V4 ? z. D PUSH EBX
. D I4 V& g, e( I/ d @ PUSH ESI # {7 H( `, Z. u0 C, M
PUSH EDI ! _+ O: P5 j- I1 n' q/ L* H$ k
......
9 ~# { a, b e- a0 D. l ......
/ L# `3 ]* K. ~7 s j ......
2 r0 {( V, q- }$ z3 q6 u9 w REPZ STOSB 〈-还原字节 & u( C& m9 c4 l; ]9 w
POPFD ! r6 Z8 T1 `" \6 D* V; D$ x
POPAD ; V3 m' J- E9 s: c/ `4 g% u5 ~. s1 K
JMP_TO_OEP ) R5 c3 E3 R" p+ x0 k( J4 v
3 f+ V+ V$ }! ?. l. i6 {& J, Y2 H
3. 没有抽掉的字节时,只执行PopAD指令和跳转到OEP。+ X1 n) b/ B1 z/ b4 y( G
4 P' P+ ~' x$ X( l那么我们怎么处理它呢?% W- i' V1 A: v- z2 z0 B' W
看看ASPR在跳转到OEP前的最后几步是什么。这需要查看跟踪日记。 ; V% w/ J1 P: J7 ^8 V h. _5 g1 x
太好了!Olly可以使用"Run Trace"功能来得到一个 跟踪日记。
9 e' j0 R3 U7 ]0 l2 v1 `这样…选择菜单: View->Run trace 1 f: Y' j8 A0 e+ N1 X
现在我们看见一个新窗口…跳转到最后一行的前一行,你会看到CPU窗口也变为同样的地址,象下面这样:
( c# p7 x6 M7 h: m! t4 ^+ ?$ x, n% r$ E& M5 v; l
017F5779 F3:AA REP STOS BYTE PTR ES:[EDI]
6 z. B9 ~1 F p2 X 017F577B 9D POPFD : W5 U/ {, W6 a1 ~+ ]) F: t
017F577C 61 POPAD ; e3 L% O# c8 R9 c- ]6 P
017F577D -E9 D992D8FE JMP SYSTEMCL.0057EA5B 〈-OEP的地址 : p* W- B( t5 g' _5 S2 `/ r
4 W" l3 O e* v3 k: y我们用第二种方法对付它!!
4 F3 h8 T6 ?8 ]9 n) ^# O J4 u) N- {3 k R& ?
上面的内容我是在 winXP下发现的,不是 win98:: 0 k7 u; K. c4 ^# H4 m! ?/ {
在CPU窗口里按 Ctrl+S(搜索命令的次序)
' h" s$ S3 A# W8 @* r- v+ ^! D0 q写入下面的:
& f n& N: n% x3 t0 _. l7 T' w6 e# r% K0 ]4 A) Q
PUSH EBX 6 V5 d5 J Y5 P
PUSH ESI
" g; x, v* [' s: i! W PUSH EDI
! }7 M* Z0 f, U- R9 g9 y) e: L2 z4 X2 Q1 x, y5 y
你会发现:' U/ x3 n8 `( W, @, Y k
7 c' ^7 u' K3 v 01029227 0055 8B ADD BYTE PTR SS:[EBP-75],DL ( y r5 I8 b' p# d" u5 `
0102922A EC IN AL,DX ; I/O命令
8 h; p- Z% V0 n" z 0102922B 83EC 54 SUB ESP,54 6 B' e9 W6 Z; f+ c8 C% q
0102922E 53 PUSH EBX ; s# r. K) C+ K: q/ p7 N
0102922F 56 PUSH ESI * f0 h1 k& \% w' {
01029230 57 PUSH EDI 3 n2 v0 o: F+ N+ A
01029231 6A 11 PUSH 11
" o5 i* Z' i5 T1 q' a' }5 W/ Y
* ?9 M5 |, f: I. [5 [# k; P' H忽略 "00",你会找到抽掉的字节:55,8b,ec,83,ec,54
8 Q" O+ l8 g" ?6 L8 [$ z记下它们,以后会有用的…9 P! W: W, F% Q# @) Z$ o
$ p5 V% Q' f8 `: w# _2 ]8 v7 x. a- i
关闭OLLY…+ Z0 s% x2 y# a& X% u0 _6 _
目前是不需要它啦…6 j( `4 j6 R( Q+ D
6 _5 s$ u" L5 N7 U6 o; f) d$ E' T
" u& `( d7 h) j* H1 P=============================
3 k" f6 l2 N3 ?第三步-重建IAT=9 o7 z# S, G% e6 N) L4 p( w
=============================
; u6 d" e+ P/ u! d) |: `$ D! S" r5 Y3 [9 {! n" @
1. 首先运行软件,等候它被载入。 1 |/ c3 O% L* O+ P X H% f: R
2. 运行Imprec,从列表中选择进程。
) O, V& D; n7 @* y5 D9 i6 @* y7 S: X3. 按"IAT AutoSearch" 4 _7 Y4 g, s3 d8 W# c
4. 把大小从"BC"修改为1000(BC太小了!!)
% v6 i Y: {' Q# h. Q5. 按"Get Imports"
! v) D' q; A3 |8 _1 K2 f, L; g6. 按"Show Invalid"
) I( |' D; q, s7. 在显示无效的项目上右击鼠标,选择"Trace level 1"
- T+ Q3 n! \# D/ m [0 f3 q8. 再次按"Show Invalid"…现在我们应该得到下面的东西: ! D( y. A' _6 l+ U, w
& a/ D4 _7 ^9 _; ~9 X" P, i (从保存的树中剪切)
) ]/ X$ D1 K- G7 n3 t FThunk: 0019E258 NbFunc: 00000400 # A6 c) a+ y! ~0 ]: \7 X: B
1 0019E258 kernel32.dll 00D6 DeleteCriticalSection ( X9 o; t* N: U' g; x7 t0 `/ y; G/ G) \
1 0019E25C kernel32.dll 0228 LeaveCriticalSection
$ [& Z; T* q: W( j ................ " R' Y( T$ i' @$ U1 t% E2 T
省略-省略3 ~* p) e0 U8 z8 \
................ 9 g7 n4 Y i6 t5 {7 x
1 0019E2A4 kernel32.dll 01D1 GetThreadLocale + _! u# w- ]2 S/ T; U- w0 O
1 0019E2A8 kernel32.dll 01B9 GetStartupInfoA
0 \3 e% K9 D( G" n- P: ~ 0 0019E2AC ? 0000 017E0F2C <-- good
% B4 J' M& B3 F5 W" j- ? 0 0019E2B0 ? 0000 017E139C <-- good 0 k7 V3 z \, g9 x% g( {1 [
1 0019E2B4 kernel32.dll 018B GetModuleFileNameA # a5 W Q8 g$ p \3 { H4 K
1 0019E2B8 kernel32.dll 0183 GetLocaleInfoA
M0 g$ ?# @1 t$ t" m 1 0019E2BC kernel32.dll 0181 GetLastError
5 t* X9 M0 [; S- g( } 1 0019E2C0 kernel32.dll 0158 GetCurrentDirectoryA
+ m( e7 i7 y7 [* Q. S- ^ 0 0019E2C4 ? 0000 017E1408 <-- good
( O$ V- ]# T3 a' i 1 0019E2C8 kernel32.dll 0133 FreeLibrary
- ]/ V" f( s/ S5 D2 J 1 0019E2CC kernel32.dll 011C FindFirstFileA
$ p! N+ L) n; ]2 I5 @2 I. e ..................
4 _$ c( D+ y5 E 省略-省略/ ]1 A9 f& T: W! Y& i3 d
.................. ! g! {" ~8 {' G3 b) F8 {% V
1 0019E314 kernel32.dll 00A0 CloseHandle
5 d; a7 H) i" q 0 0019E318 ? 0000 0255A00E <-- BAD 6 Q0 e6 g! x3 \' J: M
1 0019E31C user32.dll 0112 GetKeyboardType
1 c* n5 x" L- \1 [! m$ d 1 0019E320 user32.dll 019F LoadStringA
% J1 O' E2 Q8 ^/ b& q* w0 W 1 0019E324 user32.dll 01AD MessageBoxA
4 E' \" F1 e1 D( @6 @* c 1 0019E328 user32.dll 0026 CharNextA ; x) o! \0 Q& l& V1 x: B9 `' X6 D S
0 0019E32C ? 0000 70F7D832 <-- BAD
$ d) l1 M+ {, J+ {: j 1 0019E330 advapi32.dll 00F7 RegQueryvalueExA
) h. n1 ~% [ F. Q, U 1 0019E334 advapi32.dll 00EF RegOpenKeyExA
- ^. [" C+ E6 h; \' [9 R& y. \ 1 0019E338 advapi32.dll 00D8 RegCloseKey ' I3 Y. I# S0 i# c( x# K" ~2 X
0 0019E33C ? 0000 F37514C2 <-- BAD
) \2 t( b" D( ~! a+ j( j% R 1 0019E340 oleaut32.dll 0006 SysFreeString
2 b$ P4 v3 U( H# o% }+ \9 E! Z 1 0019E344 oleaut32.dll 0005 SysReAllocStringLen
u* r+ [/ I9 G- \6 F4 F9 I# W 1 0019E348 oleaut32.dll 0004 SysAllocStringLen , L2 Z1 B ^+ M
0 0019E34C ? 0000 4007F56E <-- BAD % T/ E3 t/ x: M0 [3 L5 _
1 0019E350 kernel32.dll 0307 TlsSetvalue
2 f) h) H5 l4 a; q 1 0019E354 kernel32.dll 0306 TlsGetvalue
( F5 ~3 {; P+ d2 z0 c) c 1 0019E358 kernel32.dll 01E6 GlobalAlloc
" u, q5 v Q6 U* r' N+ h8 F 0 0019E35C ? 0000 017E139C <-- good
9 G" h P2 `! i- g) J 0 0019E360 ? 0000 BF57C0D8 <-- BAD
* }, z- Y; ?, c) E9 W5 s5 y& g .......................
% S3 x( p2 S5 N4 _! s 省略-省略 - E: N9 Q6 b- p' i
....................... 8 n% j( K4 b; b+ b- u* j
2 n# `$ C( x H; r7 [$ I4 N好了,我们继续重复这样做…0 |" n; N1 e4 _5 L( k
我们需要手工选择所有坏地址(不在压缩代码内),然后在它们上面右击鼠标,从菜单里选择 "Cut Thunk(s)"。 & {1 {* ^9 W1 G* f
观察窗口在最下…那儿有好的Thunk(s)…
% n2 u M; T; w4 c# H: I7 g6 V! @) m9 I0 C+ o _2 p
现在我们需要修正这些好字节…你可能从fraviamb.cjb.net下载过一些插件2 q8 \2 N0 Q/ ~9 ?5 h9 _; q* q
或者看我其他关于如何重建的文章(New2Cracking.cjb.net或者Fraviamb.cjb.net)( q0 C3 {: I9 |! n7 P
这是我修正的:% C# `3 R5 P7 B" f$ Z/ U3 x
$ n. J1 a0 y/ S6 V: b' n6 o: _$ I# [ 0019E2AC-> 017E0F2C ->GetProcAddress
$ D* i5 A% H2 J" A! p- Z 0019E2B0-> 017E139C ->GetModuleHandleA # D- p6 n2 Q/ w0 f$ K) V4 b
0019E2C4-> 017E1408 ->GetCommandLineA
# ?6 D3 ^4 `0 Z* l1 P 0019E35C-> 017E139C ->GetModuleHandleA 3 t, ~; o) V7 l- T" R
0019E428-> 017E1420 ->LockResource 8 \" P) ^) y0 k- M% f" ~. i5 Z0 G
0019E47C-> 017E13C4 ->GetVersion
1 F: |& i# @' c+ V8 n/ _4 o 0019E4AC-> 017E0F2C ->GetProcAddress
: n, D! S, | v1 @% e! ~4 A4 _ 0019E4B8-> 017E139C ->GetModuleHandleA , T2 @0 ?: J: b9 y% K0 _
0019E4FC-> 017E13F8 ->GetCurrentProcessId
9 _6 b7 g1 X# T& j1 u: L! I$ r 0019E500-> 017E13F0 ->GetCurrentProcess
, N" e- H8 A) @% `1 f. p! n7 C# C 0019E50C-> 017E1430 ->FreeResource 3 l. p. t, b5 C1 `8 { C
0 a5 K9 u6 P+ Z
9. 按"Fix Dump",选择我们抓取的文件…
F1 n8 B& U* Nimprec将会以在文件名前加"_"的方式保存抓取的文件。 7 M0 x5 R3 n. P% P" M5 `9 |0 F
5 b$ M Y# }* L6 |: [========================= 3 @4 A" N& ]2 k" M1 h1 n
第四步-修正OEP= ) \5 n- Q6 g4 X5 I0 x1 s
=========================
) [( P5 y7 h. g( B; K+ l+ ?2 ^! c. l% M+ y/ U8 a2 K
1.打开HVIEW /Hex编辑器,跳转到OEP的偏移地址:57ea5b处,
7 [2 L) F: Y N% G向后移6字节到57ea55处,用"00"替换写入 stolen bytes. 保存为新文件。
0 p7 k9 v' u' `# F1 i
$ a" D- C# D! ?6 h, Z8 x2. 打开ProcDump/Pe-Edit ,点击“Pe-Edit”按纽载入重建的新文件,修改入口点为:57ea55 (因为抽掉的字节)
) C! F" }! d A) S0 K$ I- v: U# D
! o C* [: u) [0 O6 n. y3. 如果你现在试图运行程序,它会死掉的!! 2 L" e s9 l; ^% c$ }
, d& K1 X+ A4 t- m" L c
4. 打开Olly并载入我们的修正文件。 8 U0 i$ w; V5 T% Y' Q4 v3 B
% X+ Y/ J& x5 P2 j5. 停在OEP: 57ea55处,EAX寄存器的值是什么?还记得我告诉过你在抓取之前保存的EAX的值吗?它是EAX=57E318,两个值的差别意味着有两
" C0 k1 O: m: O2 Y2 d6 ? _" U: u' q* e$ U& T5 Q% v& \: J
个以上的命令: that is stolen:
. `: d8 w5 E/ ~% J' d" G" p
8 N. s" n. D& F$ C MOV EAX, 0157E318
, k) L' U6 ?% A4 Z
) o: Q% X: J; L- V) S这条指令占用5个字节(你可自己在 HVIEW里试一下)
, V, {3 B8 l% o! ]; Y8 a B818E35700 MOV EAX, 0157E318 & d2 e: Z5 |3 a7 P5 y5 W8 [$ Z: p/ F
这意味着有6+5=11(十进制)个抽掉的字节
+ X- W1 X8 [5 Y- B9 ~那么,真正的OEP是: 8 Y! C. O0 j- o; B5 M5 {* q8 K
11=B(hex)
6 v$ e5 {, y7 ]5 Z+ M- [. M* ZOLD_OEP-STOLEN_BYTES=57EA5B-B=57EA50
6 r3 u; }* p. `/ C- g9 ROEP = 57EA50 : Z. s( u# k# e# Y& F: D
用HVIEW/Hex打开,跳转到新的OEP,写入:
; u- B# m b. s 0 b3 S6 R$ Q7 r' B& \' f( \
55,8B,EC,83,EC,54,B8,18,E3,57,00 + B, d) ~3 D f/ `
% z( J; K; }4 M& @# V
用ProcDump\Pe-Edit修改入口点为:57EA50 5 h# y$ Z4 f% x- N# p& L3 Y
哈哈,这下程序能运行了!!!
' k4 z N- |4 Y" ^1 |收工!!!
$ A' B! P& v( H: b5 A2 F1 y
4 _# I3 a/ p2 m3 M; }, S, N) g翻译后记:俺一直用Softice,没用过OllyDbg,所以有些内容不知道是否准确,再者水平有限,如有错误,请各位大虾指点!!
, x( v% W5 K3 J
4 Y2 R4 n+ C8 L' _" h
1 i8 ^ ?% n* B0 R% q# U" v |
zan
|