一个比较简单的CrackMe文件
第一步看一下exe信息,是否加壳之类的,这个比较简单,没有涉及到加壳脱壳
exeinfo
接下来运行软件:
运行软件
按照提示我们输入用户名和序列号,弹窗提示错误信息,拿到相关信息,接着打开x64dbg开始分析,打开之后先搜索字符串:
搜索字符串
可以看到相关的字符串,这里我们定位到"You Get It",双击查看:
条件分支
这里是一个跳转,根据zf寄存器的状态进行跳转。
在这里可以进行爆破,将je命令直接使用nop填充或者修改成相反的命令jne都可以实现:
nop填充
jne跳转
爆破成功
但是我们的目的是分析序列号是怎么产生的,所以接着往上找,找一下相关的函数之类的:
比较函数
往上一点点看到了strcmp函数,下个断点,然后重新运行输入用户名和序列号,在这里也可以看到push了一个字符串"AKA-487757",推测这个应该就是真正的序列号,重新打开软件验证确实如此,只不过还不知道这个序列号是怎么生成的,还要继续找。
一直往上翻一直到函数开始的地方,在这里下个断点,然后开始进行跟踪:
函数开头
在这里看到我们输入的用户名了,推测序列号的产生应该跟用户名相关,一边f8单步执行一边观察,因为程序比较简单,所以很快就找到关键的地方了:
关键点-生成序列号
在0x402415处,有一个函数"lenbstr",它获取用户名的长度,返回值在eax里面,接着下一行把eax的值给edi,然后再跳过一行,在0x402420处,把用户名的长度乘以0x17cfb;
接下来在0x40242d处,这个函数从用户名中返回第一个字母的ascii码的值,接下来的两行把ascii码的值加到刚才计算出来的值上面;
然后在0x40243f处,这个函数把16进制的值转换成10进制,序列码的后半部分就生成了。
再往下跟就到了字符串拼接函数跟我们最开始找到的字符串比较函数了:
字符串拼接+比较函数
到这里,整个序列码的生成就分析完成了,接下来可以按照这个步骤写一个生成序列号的代码:
[Python] 纯文本查看 复制代码
username = "FZZZP"
len_username = len(username)
mid_value = len_username * 0x17cfb
first_ascii = ord(username[0])
key = mid_value + first_ascii
Serial = "AKA-" + str(key)
print(Serial)
在这里我们使用"FZZZP"作为用户名,生成的序列号为:AKA-487725
最终验证:
验证
|