首页
社区
课程
招聘
从一个简单破解中浅谈破解的思路[原创]
发表于: 2005-1-8 15:08 21808

从一个简单破解中浅谈破解的思路[原创]

2005-1-8 15:08
21808

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

工具:
OllyDbg 1.10

crackme:

http://www.crackmes.de/users/zionz/crackmes/zi___crakme/download

总结:

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

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

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

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

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

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

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

提议:

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

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

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

正文:

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

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

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

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

1016CD75                 45 4E 54 45 52 20 53 45 52 49 41       ENTER SERIA
1016CD85  4C 20 54 4F 20 43 4F 4E 54 49 4E 55 45 3A 00 41  L TO CONTINUE:.A
1016CD95  58 39 34 33 00 57 45 4C 4C 20 44 4F 4E 45 21 00  X943.WELL DONE!.
1016CDA5  57 52 4F 4E 47 20 53 45 52 49 41 4C              WRONG SERIAL

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

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

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

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

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

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

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

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

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

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

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

ESI 00A5D321 ASCII "QWERTYUIOP"
EDI 00A59FC1 ASCII "AX943"

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

10004DED     74 05         JE SHORT Zi__Crac.10004DF4

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

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

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

10004DFB     3BD6          CMP EDX,ESI

代码窗口下面还有提示:

ESI=00000005
EDX=0000000A

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

10004DFD     73 05         JNB SHORT Zi__Crac.10004E04

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

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

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

10004E06     3BD6          CMP EDX,ESI

而且下面紧接的是

10004E08     0F95C0        SETNE AL

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

再看下面

10004E0B     8BF0          MOV ESI,EAX
10004E0D     85DB          TEST EBX,EBX
10004E0F     BF 38AD1210   MOV EDI,Zi__Crac.1012AD38
10004E14     74 33         JE SHORT Zi__Crac.10004E49
10004E16     8BCB          MOV ECX,EBX
10004E18     E8 03FCFFFF   CALL Zi__Crac.10004A20

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

10004E0B      33F6          XOR ESI,ESI

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

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

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

破解用时:18分钟  : (


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (46)
雪    币: 97697
活跃值: (200834)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
辛苦!!!
2005-1-8 15:14
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
好帖子~:D
转了
2005-1-8 18:05
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
收藏,学习!
2005-1-8 23:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
OK!Thank you!
2005-1-9 11:41
0
雪    币: 31
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
Thx¬¬
2005-1-9 19:10
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
7
果然有思想啊。。。。。。
2005-1-9 22:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习学习!
2005-1-10 15:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习…………
2005-1-11 10:27
0
雪    币: 237
活跃值: (145)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
又给我提供了一个好的破解思路,感谢!!!
2005-1-12 09:20
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错,感谢。
2005-1-12 10:03
0
雪    币: 209
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
太好了!!!适合我们菜鸟!!!!!!!谢谢!!!
2005-1-12 13:22
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
13
写得好啊!顶!
2005-1-12 20:57
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
最初由 vifun 发布
从一个简单破解中浅谈破解的思路


工具:
OllyDbg 1.10
........

楼主:其实这个crakme我认为还有一个更好的爆破方法!请留意这里:10004E08     0F95C0        SETNE AL  -----判断注册码正确与否的关键语句!(我们注意到:当我们输入假注册码并且程序经过这里之前AL的值为0!而当程序经过这里之后AL的值为1!猜想:程序判断注册码正确与否的依据:程序经过这里之后AL的值是否为0!故我们可将这里NOP掉,并将程序读完假注册码后的第一个跳转语句改为直接JUMP到这里(即将10004DED     74 05         JE SHORT Zi__Crac.10004DF4  改为:JMP 10004E08)即可完美爆破!!!
2005-1-13 15:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这是我迄今为止看到的最好的教材。如果都像楼主这样细心,菜鸟早就变凤凰了,遗憾这样的文章少~!!!
大家别说我没见过世面哦,我本是传说中的菜~菜~~菜菜~~鸟
2005-1-16 22:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
忘了再说一句:精品中的精品啊
2005-1-16 22:50
0
雪    币: 162
活跃值: (63)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17

这种帖子对我这种菜菜鸟真是及时雨啊!我喜欢!!
2005-1-19 18:58
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
非常感谢……
2005-1-20 08:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
尤其是作者的“提示”说道我们菜菜鸟的心中了!!!
2005-1-27 10:20
0
雪    币: 400
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
有这样的作者,又何愁,几几后,出一个PRO.CRACKER呢。
谢谢
2005-1-27 10:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
ESI 00A5D321 ASCII "QWERTYUIOP"
EDI 00A59FC1 ASCII "AX943"

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

10004DED     74 05         JE SHORT Zi__Crac.10004DF4

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

请问怎么把74改成EB??????
2005-1-27 13:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
收藏,学习
2005-1-29 13:56
0
雪    币: 200
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
偶要学习!
2005-1-29 17:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这样的教材才能说得上是真正的教材呐!
作为像我这样的“菜鸟”级的“菜鸟”,真切希望多多看到这样的教材。
感谢楼主(虽然有些地方我还是没有看懂),为我增加了努力学习的信心!
再次感谢楼主!!
2005-2-1 20:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
看起来不错,回去好好好研究
2005-2-2 11:34
0
游客
登录 | 注册 方可回帖
返回
//