QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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 15:53 , Processed in 0.333336 second(s), 52 queries .

回顶部