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

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