QQ登录

只需要一步,快速开始

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

用OllyDbg脱ASPR 1.3x的壳

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

回顶部