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

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