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

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