QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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 18:25 , Processed in 0.410412 second(s), 51 queries .

回顶部