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

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