QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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 18:22 , Processed in 0.406979 second(s), 51 queries .

回顶部