之前看过一本书“从零开始学破解”,文中用到了一个CrackMe程序,我发现程序的注册算法很简单,非常适合破解初学者拿来练习,所以就写下了本文与众人分享,希望大家在新学期里技术都能有所突破。
首先运行程序,试着输入用户名和注册码,会弹出错误提示“u fuckin noobl”,使用PEID查壳,发现程序是使用“Borland Delphi 4.0-5.0”编写的没有加壳。
直接载人OD,查找参考字符串,就会找到错误提示“u fuckin noob!”,双击后就来到了00447F65处,往上找就看到正确的提示了。再往上找我们会看到这一段的段首,也就是“00447EB0 |.55 PUSH EBP”,按F2在此处下一个断点,再按F9运行程序,随手输入一个用户名和注册码后,程序就会被中断下来。
这一段的作用就是对我们输入的用户名进行处理,这是一个循环,首先读取用户名,然后把它写入到另一个地方,如果被写入后的值的长度小于6则返回,再次读取用户名并且跟到原来被写入值的后面,再看被写入后的值的长度是否小于6,如果仍小于再跳回去继续,直到长度不小于6为止,比如我输入的用户名是ab,程序就会把它变成ababab。我们再来看下面这段代码:
这一段的作用是计算注册码,从这一段我们可以知道不管用户名长度是多少,注册码都是6位的。程序会将用户名的前6位的ASC[]值依次加上5,结果就是我们要的注册码了,继续向下执行看看:
可以看出程序是明码比较的,这是非常经典的注册验证,许多软件都在使用这种注册验证,方便了我们直接追踪出注册码,在00447F36处可以实现爆破,可以将JNZ修改为JZ或NOP掉,这样输入假的注册码仍会提示注册成功。
最后我再总结一下,程序根据输入的用户名来计算注册码,输入的用户名如果小于6位,程序就会将用户名累加直到不小于6位,如ab就会变成ababab,abc就会变成abcabc,如果大于6位则仍是前6位有效,比如abc12变成abc12abc12后仍取前6位有效,然后将前6位分别转换成ASCII码进行相加,再将得到的值转换回来,所以注册码只会是6位的,一个用户名对应一个注册码,当然当前6位用户名相同时注册码也是相同的。比如abc123与abc1234就同时对应注册码fgh678,我们可以借助破解辅助计算工具来计算出真正的注册码,输入注册名abl23和注册码123456,计算注册码的过程是将6个字符分别转换成ASCII值并分别加上5再转换成字符就是注册码了。
所以注册码就是fg678f,现在我们来编写注册机,我使用的是Borland Delphi。
由于本人对此研究不多,文章中难免会有许多不足之处,还希望大家给予指正。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。