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

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