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

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