先运行程序,一个普通的注册码验证程序,直接上od调试
可以看到有You Get Wrong 和 You Get It 明确显示错误与正确的语句,查看到具体地址
这里我们可以看到有je语句会跳过输出正确的语句从而打印You Get Wrong,于是猜测会有判断语句,需要对汇编有一点了解即可知道这里的判断语句是test si,si 这个语句,想要验证自己的想法只需在寄存器中改变esi的值就可以看到输出了正确语句
既然有判断语句,那么前面应该会有语句用输入的Serial与正确的Serial作比较
同时上面不远处有个vbaStrCmp函数也算是验证了我们的想法,在这个函数下个断点,然后单步步入函数观察
在这里可以看到我们输入的Serial:123123 与 正确的Serial值:AKA-292642
至此,我们Crack的任务可以说只完成了一半,虽然我们能得到正确的Serial,但是我们并不知道它是怎么产生的,所以我们继续调试这个程序,观察到这里
这里对我们输入的字符串首先取了长度,然后用这个长度×0x17cfb,最后加上字符串第一位的ascii码生成一个中间值
这里的逻辑就是利用上一步生成的中间值不断去模0xa然后进行一系列操作,直到为0终止,最终每次循环中eax的最后一个数字所组成的字符串加上AKA-便是正确的Serial,如某次循环中eax的值为0x39 那么便取9出来
以下便是针对程序算法逻辑生成Serial的一个python脚本
name = "123"
Serial = ""
a = len(name) * 0x17cfb
a += ord(name[0:1])
while True:
if a / 10.0 == 0: #循环结束
break
edx = a % 10 #取除0xa的余数
a = a / 10 #取除0xa的商
edx += 0x30
Serial += hex(edx)[-1:]
Serial = "AKA-"+Serial[::-1]
print Serial
大功告成!
网友评论