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

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