QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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 23:08 , Processed in 0.439928 second(s), 52 queries .

回顶部