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

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