QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

回顶部