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

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