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

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