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

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