


使用 VB5 编写的,没有壳。
使用 OD 载入程序,搜索字符串,点击跟进代码


可以看到不远处就有一个比较语句,下断点,运行程序,程序断在了断点处

修改 ZF 标志位,继续运行程序,程序提示成功

可以看出,刚才的比较处是程序的关键。
再次运行到断点处,查看函数的参数



可以看到,程序有两个参数。一个参数是 0,还有一个参数是 FFFF。
继续观察代码,发现上面有一个赋值的代码


正是这行代码,将参数2的值变为了 FFFF。
我们大胆猜测,FFFF 是正确的标志。
将参数1的值也修改为 FFFF,程序提示正确。
来到代码头部,下断点,点击 check 按钮,程序就断了下来

向下调试代码,发现程序居然出现了一个新的提示

再查看上面的代码,程序先使用了循环浪费时间,然后使用循环结束的时间减去循环开始的时间,如果时间过大,就判断程序正在被调试,就会弹窗提示


然后程序进行长度检测,如果长度小于 5,就会直接提示错误

接下来程序会根据序列号的长度建立一个循环,循环的次数为序列号的长度

在循环中,程序依次比较每个字符是否和后一个字符是否相同

如果字符和后一个字符不相同,就进入下次循环;如果相同,就会在内存 0012F558 处加1

然后在后面和序列号长度减去1作比较,如果相同,则跳转到错误提示处

也就说序列号不可以全部为同一个值,比如说都是 1。
接下来,又是一个循环

程序求得序列号的长度,然后转化为字符串

然后得到序列号最左边的字符,最后也转化为字符串

最后调用函数,将两个数相乘,也就是将 序列号的长度和序列号第一个字符的 ASCII 值相乘

接下里,程序依次将序列号相加

循环结束,程序将相加的结果和相乘的结果进行比较。如果相等,则返回 FFFF;不想等在返回 0。
在最后再和 FFFF 进行比较,相同说明正确。

本来是想写注册机的,但是我发现了一个有趣的规律,所以就不用写注册机了



当序列号是五位数的时候。序列号首位随便填一个值,然后在 ASCII 码表上找到该值相邻的上面2个值和下面2个值,就是一个可以使用的序列号。
相关文件在我的 Github:https://github.com/UnreachableLove/160-Crackme/tree/master/Crackme017
2019-09-18 21:00:21
原文:https://www.cnblogs.com/white-album2/p/11545331.html