QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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-12 23:12 , Processed in 0.376082 second(s), 51 queries .

回顶部