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

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