|
作者:vifun http://bbs.pediy.com/
! Z* e9 d9 q9 k0 A. t工具:& W0 z8 a1 g4 J8 P8 `- w
OllyDbg 1.10
; d! O- s. F, [3 }) o7 B6 M
$ y9 c# P. W) u1 G% U! x/ b: k. ycrackme: 3 c2 b7 `4 V% z! |- j
___crakme/download">http://www.crackmes.de/users/zionz/crackmes/zi___crakme/download / B6 N/ Z3 T9 s, p8 q
总结:
; ^) V/ r5 ?" {) h: F4 M8 t1. 不要一开始就用工具,先试运行一下,感觉一下可疑的地方,获取一些重要的信息,如错误提示。 ; n( c S" {0 `8 P# N
2. 从内存中查找字符串,输入的信息肯定在内存中的,一定找得到!
* f7 y2 A( S# U. y# f9 v3. 大部分软件是等字符串全部输入了再处理的,内存跟踪,死盯着它!
5 j( [% h6 K2 {( F. I; H( @8 Q- [/ u6 Q4. 有些程序是把字符串复制几份放不同地方的,每次被断的时候可以考虑重新搜索一次内存,在所有找到的字符串上下断点。 7 U) X9 ]2 L/ C( ?8 S
5. 后发先致,先从最后一次读取入手,先分析最后的处理算法,以免在前面一直浪费时间还影响信心。
2 Y7 S& M& A# `$ L) a( ]6 X6. 细心、耐心、信心!! ; T: }. V! V& \$ m6 d$ K
为什么先写总结呢?个人觉得这次破解的体会比获得的知识更重要。这个crackme难度不大,但能给刚入门的cracker一点启示。
- z1 e9 x& D; T3 g% _0 `8 r# y% M8 M; i8 E" G$ A
提议: 9 o8 \( u1 n. F+ Q0 a Y
作为老鸟,或许感到很多事是必然的,但对我等菜鸟就不是那么明确了。以后破解文章能不能不单是过程的记录(比如突然冒出一个来到这里),最好还能是一种思想的启示(为什么你要来这里,怎么使你来这里)。 - W! G/ O. p5 I: Q& k1 K. k, T: L
最好再加上破解时间,因为一篇文章,看起来那么几百字,感觉像3、5分钟就破完一个程序一样,给初学者信心比较大的打击:"怎么我破了整天都没有搞定呢?"。加上时间,大家就可以看出差距了:"原来××牛人都用了半天,我还不太蠢^_^"。 ; ^3 U) j, i* F( _6 j) P: N+ K
老鸟看到这里就基本上不用看下去了,下面的破解实在是见笑^_^
, C) G" Q+ R# N ?4 d0 ^( X# I
6 [0 p6 F8 w% @, m$ g: j. \% A2 q正文:
' [4 E; u* y* h. U$ `+ m有感于自己也曾经是菜菜鸟(现在是菜鸟^_^),也碰到过不少菜菜鸟级的问题,藉完成一简单破解之际,特发此文,谈谈菜菜鸟最想问的问题--"为什么这样做啊","为什么决定来这里看看",希望能给未来的菜鸟一点教益。老鸟如果看烦了,小的先陪个罪^_^
5 K* v8 g/ P. O4 r$ P昨天在http://www.crackmes.de/ 随手down了个解决了的crackme(___crakme">http://www.crackmes.de/users/zionz/crackmes/zi___crakme)打算学习学习外国人的先进经验(我也是菜鸟啊),没想到两方案都是违背了作者初衷的,自己破吧! 1 t# ]$ N% ^' b/ t
先运行一下那个crackme(还是有个总体的印象好,不要什么都不清楚就用工具破解)。好了,发现是命令行界面的,随便输个号进去,回车,显示"WRONG SERIAL"(注意大小写,这个很重要,把提示都记准确一点)。 ( ^2 N7 P x8 {2 [' [! S6 K! j
用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。好了这次有了!向上滚动看看上文(通常都要上下结合的啦),发现了
$ a' Z& L# Q: B8 Y& R6 C' a1016CD75 45 4E 54 45 52 20 53 45 52 49 41 ENTER SERIA2 s& ^7 J: P. T! A
1016CD85 4C 20 54 4F 20 43 4F 4E 54 49 4E 55 45 3A 00 41 L TO CONTINUE:.A: J5 r" f7 m; r- W" u) P
1016CD95 58 39 34 33 00 57 45 4C 4C 20 44 4F 4E 45 21 00 X943.WELL DONE!.4 r% h( }. g1 N# I, ?- ^
1016CDA5 57 52 4F 4E 47 20 53 45 52 49 41 4C WRONG SERIAL 5 F1 v! A" A, q G- S
呵呵,很多字符串哦!AX943是什么,难道就是......按[F9]允许,然后输入AX943,成功了!
6 D# ]0 w+ B$ t6 K- f' i/ p: t% e两个外国人的方案都是到此为止了。如果是破解应用软件,到此也的确够了。此crackme的作者明确表示要求通过任意序列号(Note: Consider it cracked if it accept any serial, not finding the right one.)因此我们继续!
5 D' u6 { Y8 g$ D[Ctrl+F2]重新开始,按[F9]运行,出现了提示输入的界面。输个好记并且不容易在内存中存在的字符串,我这里输的是QWERTYUIOP(键盘第一行字母,都大写的)。回到OD,依然[Alt+M],然后[Ctrl+B]调出搜索窗口,输入QWERTYUIOP,按ok。很快OD就找到了 ( O6 D$ W/ l5 a* _) z7 P8 X+ b
00A5D321 51 57 45 52 54 59 55 49 4F 50 00 0D F0 AD BA QWERTYUIOP..瓠? 4 x1 a9 Z4 l7 Z+ ]& d
右击51(就是那个Q),选"Breakpoint","Memory,on access",这样当crackme读取这个序列号的时候就被中断了。回到crackme,按回车,OD把它中断在 ; @3 G( u0 x1 O: k" R
10045B7E 0FBE00 MOVSX EAX,BYTE PTR DS:[EAX] 3 K% V8 D' k+ P7 j7 X* P J
先不要急,继续[F9]运行,看看它要被读多少次(为什么这样呢,因为很多时候序列号都要被重复读取的,但重要的比较或者运算很可能在最后那次才出现,否则,最后一次读来干嘛就很值得怀疑了) $ N( z! ? c$ ]% L& M
好了,让它运行都结束,出现WRONG SERIAL(当然的结果,浪费少少时间不要紧),发现一共读了5次!我决定从最后一次入手!!(前几次很可能是一些验空串、去空格等预处理)
8 m* L2 L* x0 y, m2 i% g再一次[Ctrl+F2],再一次输入QWERTYUIOP,查找,并下断点,运行。跳过前4次的中断,我们来到最后那次读取的地方,是
, t# z' E2 T- n" ]10004DEB F3:A6 REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
* R. r$ }/ w6 g# D/ w一看知道是比较了,右边寄存器的窗口还显示出
8 O" x) @5 \. w# YESI 00A5D321 ASCII "QWERTYUIOP"- q g0 K' I# F; n9 @0 T; P. i- ^
EDI 00A59FC1 ASCII "AX943" 5 [4 Z0 C! y' ?
为了通过任意序列号,暴力改下面的跳转吧!
2 N* z& I% d5 d8 E0 m w& L" ~10004DED 74 05 JE SHORT Zi__Crac.10004DF4 6 L9 }7 e7 g% d& q/ K# q9 v
原来是相等就跳,我把74改为EB,无条件跳转! t: r2 t+ ]' n7 W+ I U
运行crackme,还是WRONG SERIAL!应该是跳转后还有判断吧...... 4 K0 `- @9 I; ] ^) X& F( t Q7 V
再次运行,跟踪,来到10004DED,无条件跳转后,按[F8]跟下去,很快就发现又有比较了 % N* j$ a9 D- s: M3 C! f4 e
10004DFB 3BD6 CMP EDX,ESI
, W) i" D4 _. C/ b! j; e0 H7 O4 f0 L代码窗口下面还有提示:
* W2 @! X% F' j3 CESI=00000005
% [2 ~ H' j9 X) O: f: v K9 I6 GEDX=0000000A
. c& I' A- V5 j2 ?$ v3 u' N想一下,5应该是AX943的长度,0A就是QWERTYUIOP的长度10,好,继续改跳转
* K4 e( g' m; u! P# K10004DFD 73 05 JNB SHORT Zi__Crac.10004E04
2 U8 F0 g) V9 m将73改为EB,无条件跳转! 5 ] ?, Q9 [6 d2 m
细想原来的JNB这个指令有可疑,为什么不是JNE呢,难道下面还有JB指令?继续[F8]跟! + [5 @) B9 y2 Q' i1 h" M# T4 e3 T
果然没有错,很快又来一个比较了
$ d- J) c" U/ m( ~0 U) z9 _7 S10004E06 3BD6 CMP EDX,ESI / c x5 ?& Y1 O& A G% B2 I
而且下面紧接的是 " @" |" u( h7 `% j9 @
10004E08 0F95C0 SETNE AL
3 I# L" K7 U7 z! J呵呵,终于来"NE"了(不相等就怎么怎么样)!! ! S( \0 ^% Z1 u/ E0 V9 r% H0 ?, ]
再看下面 . i; V) w$ ?5 \. G: E8 k u5 P
10004E0B 8BF0 MOV ESI,EAX
) ]$ W( k8 V" ?& O" D10004E0D 85DB TEST EBX,EBX9 `( ?, q- `7 @4 ]2 u) Y
10004E0F BF 38AD1210 MOV EDI,Zi__Crac.1012AD38
1 O6 Z( ?% g8 l$ H10004E14 74 33 JE SHORT Zi__Crac.10004E49
0 Q* }( c6 |4 ~# D5 }. p/ l5 C10004E16 8BCB MOV ECX,EBX
! Y1 M9 O0 E- y& @10004E18 E8 03FCFFFF CALL Zi__Crac.10004A20
) s, Y5 C5 }& W% a+ n' u
X8 ]+ M+ N! O) m: c) Z9 iESI和EAX装的就是比较的结果,然后就是一个CALL!!决不能让你存!!改掉!!目的是要ESI的数值无条件是0(使10004E06处的比较结果一定相等)。考虑到10004E0B的指令有2字节,改为
- R, U7 W- l4 }, B% d+ y& x10004E0B 33F6 XOR ESI,ESI
8 j: b! Q' K: J运行......全部通过了^_^
; u; ^; Z( t% M' n" c1 k9 K以后用16进制编辑器怎么改就不用多说了,基本工具使用的问题。 3 M7 `! B p$ D2 @
菜鸟一个,有意见或建议请不吝赐教,共同进步 : ) 5 m$ N" c4 r9 W k' ~- i
5 K3 T1 c$ N! G破解用时:18分钟 : (. J& s4 R8 q2 C7 W K% G9 O, M
* p* F& W2 }3 o, x) ~. J, h
; \. S' z( N! Q- F8 ]9 g |