数学建模社区-数学中国

标题: 从一个简单破解中浅谈破解的思路 [打印本页]

作者: 韩冰    时间: 2005-1-20 14:38
标题: 从一个简单破解中浅谈破解的思路

作者:vifun  http://bbs.pediy.com/

0 y* B5 S# O! r5 Q4 U) V

工具1 I8 }, c% w1 ~# k" r OllyDbg 1.10

* B! K8 s# F3 [- e$ u

8 O$ X: P. M2 B/ B1 ^7 t crackme:

+ j/ b e2 m8 U W

___crakme/download">http://www.crackmes.de/users/zionz/crackmes/zi___crakme/download

1 {, M8 Z: Z* v- H' U) b1 y* a( s: ^

总结:

! S, J8 e( G* m4 K+ ~. y/ i( L

1. 不要一开始就用工具,先试运行一下,感觉一下可疑的地方,获取一些重要的信息,如错误提示。

$ o C2 V; ?/ i3 d4 X

2. 从内存中查找字符串,输入的信息肯定在内存中的,一定找得到!

& P# ~4 _& H9 G

3. 大部分软件是等字符串全部输入了再处理的,内存跟踪,死盯着它!

- x8 z5 O! g- Y! _6 i

4. 有些程序是把字符串复制几份放不同地方的,每次被断的时候可以考虑重新搜索一次内存,在所有找到的字符串上下断点。

1 U* L' m( z* I& H, d {; \

5. 后发先致,先从最后一次读取入手,先分析最后的处理算法,以免在前面一直浪费时间还影响信心。

* [$ X A0 o9 J7 x3 g7 D/ D

6. 细心、耐心、信心!!

# q: |. i* Z3 Q3 v) N

为什么先写总结呢?个人觉得这次破解的体会比获得的知识更重要。这个crackme难度不大,但能给刚入门的cracker一点启示。

3 a: `0 c9 Y3 h9 U! s% ]: } ( d4 M- s' B' x' S9 u% p( @

提议:

) [2 a6 V8 W- M4 G

作为老鸟,或许感到很多事是必然的,但对我等菜鸟就不是那么明确了。以后破解文章能不能不单是过程的记录(比如突然冒出一个来到这里),最好还能是一种思想的启示(为什么你要来这里,怎么使你来这里)。

0 R; A9 R5 b* Y4 {

最好再加上破解时间,因为一篇文章,看起来那么几百字,感觉像3、5分钟就破完一个程序一样,给初学者信心比较大的打击:"怎么我破了整天都没有搞定呢?"。加上时间,大家就可以看出差距了:"原来××牛人都用了半天,我还不太蠢^_^"。

8 _3 S' t9 j, ?4 k) Y/ \8 n" @6 i

老鸟看到这里就基本上不用看下去了,下面的破解实在是见笑^_^

3 x2 c6 S4 X4 m% [$ \& C& @9 T0 H: ^4 f. [6 ]( V

正文:

5 o1 `2 \7 f* g$ W# |

有感于自己也曾经是菜菜鸟(现在是菜鸟^_^),也碰到过不少菜菜鸟级的问题,藉完成一简单破解之际,特发此文,谈谈菜菜鸟最想问的问题--"为什么这样做啊","为什么决定来这里看看",希望能给未来的菜鸟一点教益。老鸟如果看烦了,小的先陪个罪^_^

# w3 _- u5 X( Y8 @8 \+ j, }

昨天在http://www.crackmes.de/ 随手down了个解决了的crackme(___crakme">http://www.crackmes.de/users/zionz/crackmes/zi___crakme)打算学习学习外国人的先进经验(我也是菜鸟啊),没想到两方案都是违背了作者初衷的,自己破吧!

7 H7 U" M8 b+ m) G1 @

先运行一下那个crackme(还是有个总体的印象好,不要什么都不清楚就用工具破解)。好了,发现是命令行界面的,随便输个号进去,回车,显示"WRONG SERIAL"(注意大小写,这个很重要,把提示都记准确一点)。

1 h6 }5 U9 J3 J& U$ q. n

用OD试着打开,发现没有壳也没有压缩的(这个不用问为什么了吧,OD正常分析通过了)。在代码窗口右击,选"Search for","All referenced text strings",待OD弹出text string窗口后,再右击这个窗口里面随便一处,选"search for text",输入WRONG(全大写,跟提示一样),把Case sensitive和Entire scope选上,按ok。OD提示找不到。好了,这样找不到,试试那样吧:搜索内存,[Alt+M]打开Memory map窗口,右击选中"Search",在ASCII中输入WRONG,同样将Case sensitive和Entire scope选上,按ok。好了这次有了!向上滚动看看上文(通常都要上下结合的啦),发现了

" f0 p: Y" ~( H v# B

1016CD75 45 4E 54 45 52 20 53 45 52 49 41 ENTER SERIA. H( U# i" O; I% y: A 1016CD85 4C 20 54 4F 20 43 4F 4E 54 49 4E 55 45 3A 00 41 L TO CONTINUE:.A$ l3 T5 X. |& w4 e1 z" j8 O' G; n 1016CD95 58 39 34 33 00 57 45 4C 4C 20 44 4F 4E 45 21 00 X943.WELL DONE!. ' `5 a( q! t# p+ V) Q" \1016CDA5 57 52 4F 4E 47 20 53 45 52 49 41 4C WRONG SERIAL

4 _* J: b- A# U' Y, X& G5 P8 l

呵呵,很多字符串哦!AX943是什么,难道就是......按[F9]允许,然后输入AX943,成功了!

6 M! I2 \* R& z+ G4 f8 M5 K4 S. [: g! r

两个外国人的方案都是到此为止了。如果是破解应用软件,到此也的确够了。此crackme的作者明确表示要求通过任意序列号(Note: Consider it cracked if it accept any serial, not finding the right one.)因此我们继续!

. z# s( J* c8 l) K v: q

[Ctrl+F2]重新开始,按[F9]运行,出现了提示输入的界面。输个好记并且不容易在内存中存在的字符串,我这里输的是QWERTYUIOP(键盘第一行字母,都大写的)。回到OD,依然[Alt+M],然后[Ctrl+B]调出搜索窗口,输入QWERTYUIOP,按ok。很快OD就找到了

; r5 }& i9 I& [

00A5D321 51 57 45 52 54 59 55 49 4F 50 00 0D F0 AD BA QWERTYUIOP..瓠?

0 d* Z9 K5 A$ w% G# e! @

右击51(就是那个Q),选"Breakpoint","Memory,on access",这样当crackme读取这个序列号的时候就被中断了。回到crackme,按回车,OD把它中断在

% b" u& ~1 y/ ^- {) F0 v: M0 @

10045B7E 0FBE00 MOVSX EAX,BYTE PTR DS:[EAX]

; Z( k; [7 ] e+ k' x+ B- C

先不要急,继续[F9]运行,看看它要被读多少次(为什么这样呢,因为很多时候序列号都要被重复读取的,但重要的比较或者运算很可能在最后那次才出现,否则,最后一次读来干嘛就很值得怀疑了)

: s _9 H9 s- Y' x- n+ E+ _" r. B

好了,让它运行都结束,出现WRONG SERIAL(当然的结果,浪费少少时间不要紧),发现一共读了5次!我决定从最后一次入手!!(前几次很可能是一些验空串、去空格等预处理)

; J6 e6 B- f6 L( r' L$ ~

再一次[Ctrl+F2],再一次输入QWERTYUIOP,查找,并下断点,运行。跳过前4次的中断,我们来到最后那次读取的地方,是

3 A; B/ ?5 |6 k0 C

10004DEB F3:A6 REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]

2 s2 y" m! W( c4 K

一看知道是比较了,右边寄存器的窗口还显示出

6 C6 R' ~, d8 u8 j$ G b7 O& x z

ESI 00A5D321 ASCII "QWERTYUIOP"9 A# w% k( U" x, K6 i9 f! v EDI 00A59FC1 ASCII "AX943"

, u0 }3 o, Y9 [( z$ i* Z6 w

为了通过任意序列号,暴力改下面的跳转吧!

6 V* D& F& ^/ H- \$ i: a: s+ N

10004DED 74 05 JE SHORT Zi__Crac.10004DF4

6 i$ n, p/ K3 q, w

原来是相等就跳,我把74改为EB,无条件跳转!

" J: j( J; `$ h) _3 k( D: N: Q' {# I

运行crackme,还是WRONG SERIAL!应该是跳转后还有判断吧......

: z B. I7 Z+ b% n, _! x

再次运行,跟踪,来到10004DED,无条件跳转后,按[F8]跟下去,很快就发现又有比较了

3 a4 Q; X7 M- M. Y* q

10004DFB 3BD6 CMP EDX,ESI

7 K D) ?* d3 l2 f8 G" Q( ]

代码窗口下面还有提示:

& N8 a: M9 ^5 K/ a

ESI=00000005 8 t- z; G8 `& K4 JEDX=0000000A

w$ b: M8 _0 p! k; n1 e2 K, n

想一下,5应该是AX943的长度,0A就是QWERTYUIOP的长度10,好,继续改跳转

+ D5 Z/ D) ]2 M8 F' ?

10004DFD 73 05 JNB SHORT Zi__Crac.10004E04

' F4 F$ t0 n2 E* U: Z! P9 _; _- _

将73改为EB,无条件跳转!

( }1 p: }: n" t1 j; Q

细想原来的JNB这个指令有可疑,为什么不是JNE呢,难道下面还有JB指令?继续[F8]跟!

( S# f; H% J5 l/ \: |

果然没有错,很快又来一个比较了

6 X. C2 I6 n+ _0 v1 u% h6 K

10004E06 3BD6 CMP EDX,ESI

, P c# S2 M" B, ~+ u

而且下面紧接的是

; I6 R5 ]0 y9 W

10004E08 0F95C0 SETNE AL

$ Z" P3 p L7 B* v, R4 Q* Z

呵呵,终于来"NE"了(不相等就怎么怎么样)!!

# Z! d! u: `: l

再看下面

6 i4 E0 V) _8 R9 ~2 f

10004E0B 8BF0 MOV ESI,EAX 7 T2 x/ @0 [3 ^) I' ]5 F3 V$ ?! w6 u0 _10004E0D 85DB TEST EBX,EBX ; l/ D: K4 e) n8 A! ]10004E0F BF 38AD1210 MOV EDI,Zi__Crac.1012AD38 c7 J3 |" O0 g( c- c' k) O10004E14 74 33 JE SHORT Zi__Crac.10004E49 7 a5 Z8 Q `) D3 N/ u5 z2 q1 Y10004E16 8BCB MOV ECX,EBX+ W; U ?& b. l% g$ h6 i9 C 10004E18 E8 03FCFFFF CALL Zi__Crac.10004A20

0 p1 s2 x1 K9 v: B

8 Y' t8 M; [6 H8 v2 b: E ESI和EAX装的就是比较的结果,然后就是一个CALL!!决不能让你存!!改掉!!目的是要ESI的数值无条件是0(使10004E06处的比较结果一定相等)。考虑到10004E0B的指令有2字节,改为

! y) o( }0 `! Z+ B

10004E0B 33F6 XOR ESI,ESI

. G. h+ W* b" k6 I) D- I

运行......全部通过了^_^

: }. W1 n; i* r- X4 }1 U% C% `* }

以后用16进制编辑器怎么改就不用多说了,基本工具使用的问题。

; E* Q/ U2 G/ B! q* x& X% [

菜鸟一个,有意见或建议请不吝赐教,共同进步 : )

0 h8 p, i6 t; a4 H \

9 |, s# i( c6 F3 R# j 破解用时:18分钟 : ( : w' o2 O! O. U; m. T6 x/ K- ?

. l9 p3 l! s) H9 r6 }) P

5 W' ^3 V# w+ `6 s8 v, P( c: c






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5