QQ登录

只需要一步,快速开始

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

从一个简单破解中浅谈破解的思路

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-20 14:38 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

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

! n2 U7 t2 k/ C) Z( ^ }

工具$ E' G4 I$ A! a1 H3 K& dOllyDbg 1.10

* I8 [$ i- h* E% J& O( z3 t: f4 o

) W2 E0 l5 E1 g, u1 x4 W crackme:

. d; j: H2 m6 c5 e) ^) E

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

( c1 E4 N ~6 |

总结:

' b' _9 I: ]- n4 _

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

1 j" I- j' \# f# O5 K0 ]

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

7 j$ d* L5 H2 K

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

- L! p6 K3 k. t, @

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

2 i, S; a0 |0 C- n; S) k8 R

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

0 y$ o( _) h" N) B3 N

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

- v5 F! g6 h0 L; }

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

* ^/ ]. ]- O; ~" m 7 R: V ^' Y" l7 L- }0 Y7 P- \3 A! \

提议:

& P5 s* Z1 I$ s, G

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

, _5 Q+ Q3 Y- r3 r1 X5 J

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

- ~ Q1 \ o' j( `; O

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

( {# g% t. l% V# U+ B2 K 8 A v3 w9 `4 Y% o; s' D

正文:

$ f% a5 L) t; m, i" z

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

7 C: i1 w. ]( \$ ?# a7 m( M K

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

' S- e, Y ` k. w" p0 q

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

+ k, H& G& @. f% m1 l2 @

用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。好了这次有了!向上滚动看看上文(通常都要上下结合的啦),发现了

1 j1 r0 G, }- \7 m

1016CD75 45 4E 54 45 52 20 53 45 52 49 41 ENTER SERIA . ? p. j. ^% ~& A1 p1016CD85 4C 20 54 4F 20 43 4F 4E 54 49 4E 55 45 3A 00 41 L TO CONTINUE:.A1 t' f# X1 \( ~+ S 1016CD95 58 39 34 33 00 57 45 4C 4C 20 44 4F 4E 45 21 00 X943.WELL DONE!. $ W2 T# g. r- [+ ^8 E$ [" T- b) g1016CDA5 57 52 4F 4E 47 20 53 45 52 49 41 4C WRONG SERIAL

, V, E; e. w1 v" E& v! J

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

3 n. I# `( }; g S; b& T$ J( k

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

+ |. w+ @* y% w

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

; E- p8 `/ y0 \; p* \- w+ W

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

7 E- y; D7 n O

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

! \; o: y' _- U4 r

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

& y% w- Z& ?* C) D4 s

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

+ {5 W' _6 F' ^+ |

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

' V, P5 Q) v) J6 W8 o

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

: T! i- M; o; A0 U

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

' J2 U |2 g: e5 H" e5 ~4 k. H

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

- B. Y2 o1 A ?, W8 _; z

ESI 00A5D321 ASCII "QWERTYUIOP" + R$ }( Q3 ?& @" `5 R$ N% DEDI 00A59FC1 ASCII "AX943"

+ h ]5 T; a) ~, c. _

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

- S) G7 F0 w8 M' k7 M) J: U

10004DED 74 05 JE SHORT Zi__Crac.10004DF4

7 {! y+ F% v( B& ^" p! J) `. B8 e

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

2 i6 `) P* `' _3 w2 i# n! L# T2 @: u

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

: Z0 q% A8 N$ n, ?

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

6 W4 H( X" `. X0 N/ W2 f& J2 ~

10004DFB 3BD6 CMP EDX,ESI

; f2 t1 g u0 J/ c1 Z

代码窗口下面还有提示:

: s2 U! ?8 q+ a. X' |

ESI=00000005 6 i3 M. q. P* G+ r( `* W/ {+ y5 WEDX=0000000A

+ n0 b( V6 w$ j9 T/ y. F$ N

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

! ?3 g( F5 g* l8 l; f* [1 }

10004DFD 73 05 JNB SHORT Zi__Crac.10004E04

/ X4 Z0 v9 M) i- h; W, X' X

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

" y0 s: h- p. p6 ~# M, C

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

% P6 D1 ]9 B/ s( e1 { G

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

2 R4 i) _- F' ` V

10004E06 3BD6 CMP EDX,ESI

; U1 ?3 ^& Y$ n! _/ L U7 i+ P; _

而且下面紧接的是

9 P$ w: X4 G2 L4 v8 R9 K

10004E08 0F95C0 SETNE AL

7 O' w2 q6 ^4 f

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

* X; g; S- |4 a! Z) Y% F! `

再看下面

& r4 C* j+ l3 ^/ n, Q7 ]

10004E0B 8BF0 MOV ESI,EAX 1 ^5 N/ C+ S* y10004E0D 85DB TEST EBX,EBX 9 U/ u1 {! z8 |8 w10004E0F BF 38AD1210 MOV EDI,Zi__Crac.1012AD38 % B+ }: O/ p3 P1 D10004E14 74 33 JE SHORT Zi__Crac.10004E49% O0 y8 h/ |6 l [7 n 10004E16 8BCB MOV ECX,EBX & e% @0 C2 Z2 F5 W- Z7 ?10004E18 E8 03FCFFFF CALL Zi__Crac.10004A20

5 q9 P6 g, T; i2 R3 |

! l! q t& a- [& p4 _! e) U# `( e/ {ESI和EAX装的就是比较的结果,然后就是一个CALL!!决不能让你存!!改掉!!目的是要ESI的数值无条件是0(使10004E06处的比较结果一定相等)。考虑到10004E0B的指令有2字节,改为

: I0 [: T, \) s/ F% e8 u* G' U

10004E0B 33F6 XOR ESI,ESI

+ f9 ~! Z1 n, k$ Y6 v7 Z

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

1 k/ }* X% {5 }, I Z5 h. [) K

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

4 b3 X5 w! L* \ {- N" Z$ V/ S

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

# H( J% L: {4 C0 H. ?

1 {- G1 T* T$ l% i9 H 破解用时:18分钟 : ( ( u; Z. J5 \, H5 x7 C/ [6 l9 o9 T3 ~

1 S& z3 p' L" o" K% i: Y, U# }& e

$ {6 @) v6 N. X9 q

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-10 23:29 , Processed in 0.393195 second(s), 51 queries .

回顶部