QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

回顶部