QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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-14 17:29 , Processed in 0.396350 second(s), 52 queries .

回顶部