逆向破解之160个CrackMe —— 001(中)
前置知识介绍:
-
160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合,一共160个待逆向破解的程序
-
CrackMe:一些公开给别人尝试破解的小程序,制作crackme的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位cracker,想挑战一下其它cracker的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。
-
CrackMe简称CM,cracker是以破解各种加密或有限制的商业软件为乐趣的人。
程序信息:
编号 | 作者 | 保护方式 |
---|---|---|
001 | Acid burn | Name/Serial,Serial |
工具:
-
ollyDbg(简称OD)
-
Exeinfo PE
开始破解:
1.今天完成第二个目标,只需要序列号的验证机制,打开上篇完成修改后的程序,没有了烦人的提示窗口,是不是心情也愉快的很多。接下来我们点击Serial按钮来到序列号验证窗口,随意输入一个序列号,然后点击验证按钮
2.显然我们随意输入的序列号是正确的可能性是极低的,一般友好的程序会在你验证过后给用户一个提示,告诉用户序列号是否正确,果然,程序以窗口的形式给了用户提示,又是窗口,如果你还记得昨天的方法,你应该可以找到创建该窗口的关键代码(不妨试试)
3.今天我们用一种新的方法,字符串定位法,上面验证错误后,会弹出一个窗口,显示Try Again(再来一次),我们用OD打开程序,右键->中文搜索引擎->智能搜索(这里需要插件,会在文末给大家),在弹出的界面中右键->查找,输入刚刚提示的信息Try Again,然后回车
4.现在就会定位到输入的字符串那行(如果存在),按N或B键查找下一个,发现一共有三个,还行(如果太多,这个方法就不好用了),我们在三处都下断点(双击或按回车就会跳回到反汇编窗口并停留在选中的地址处,然后按F2键下断点),然后按程序运行,输入一个序列号,进行验证
5.会发现程序停在0x42F4F8处,我们向上看,很容易就发现了关键跳转,同时发现了序列号正确的提示信息,所以只要0x42F4D5处的跳转指令不执行,验证就一定会通过,我们可以将jnz改为jmp,然后保存修改后的内容就行了,这样无论你输入什么都能正确(这就是爆破,可以参考上一篇试试)。
6.但是我们今天要找到正确的序列号,jnz指令的上一条指令是call一个函数,也就是当函数返回值是1就会实现跳转,我们在call指令所在地址0x42F4D0下断点,然后F9运行程序,再次输入一个序列号(1234,方便观察),点击验证按钮,会断在0x42F4D0处,同时我们会发现函数两个参数一个是我们输入的序列号,另一个也是一串字符串,所以这个函数的功能可能是比较两个字符串,相同就返回0,不相同就返回1。经过测试,的确如此。那么Hello Dude!就是真正的序列号
7.我们重新运行程序,输入序列号Hello Dude!,验证通过。
OD中文搜索插件
链接:https://pan.baidu.com/s/1uCs_1ImM7gvAmtBbe2g4vQ
提取码:hxz3