QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3353|回复: 0
打印 上一主题 下一主题

用OllyDbg脱ASPR 1.3x的壳

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-11 09:39 , Processed in 0.613179 second(s), 57 queries .

回顶部