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

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