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

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