QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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-4-18 17:46 , Processed in 0.556455 second(s), 52 queries .

回顶部