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

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