QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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 01:44 , Processed in 0.387463 second(s), 52 queries .

回顶部