ajj
这个程序并没有明显的确定按钮
根据这篇文章https://www.52pojie.cn/thread-613337-1-1.html
使用Dede反编译一下,在窗体窗口点击DFM Editor可以看到各种事件
注意到Panel1有两个关键事件,一个是单击事件,另一个是双击事件

这应该就是我们想要的确定按钮
下面用爆破法验证一下
爆破

搜索到如下字符串,进入注册成功字符串的反汇编
往上看,看到一处jne指令用于跳过注册成功

把这个指令改成jne下一条指令的地址
然后运行起来,输入注册码
然后点击图片,注册成功

看来现在还无法区分单击和双击两个事件的区别
算法分析
给这段代码的头部设一个断点

输入Name和Serial并点击panel1触发断点

可以看到,前两个函数的功能是获取Name,并计算Name长度,后面还加了1E,我这里结果是 4 + 1E = 22

这个函数用来把22从16进制转换为10进制数34

跟踪到这里,字符串被拼接为34Name0

后面给这个0加1,然后一直循环下去,结束条件是ebx == 13也就是循环19次,给下面的cmp指令设个断点

最后得到字符串34Name18
然而,注意观察cmp指令比较的这两个数

除了固定值85外,有一个地址处的值为0,而上述分析中,并没有看到这个值是如何被设置的,也就是下面的jne跳转永远成立,这样怎样都到不了成功字符串。因此给这个地址设一个硬件访问断点,看看是哪里会使用这个值。
注意不要重新加载或退出程序,因为每次这个地址都不一样,只需要按F9让程序跑起来即可。
我删除了Serial,程序直接断在了这个地址

程序断在这里,看到了一串字符串,可能是正确序列号
黑头Sun Bird9dseloffc-012-OKName
初步推断出规律 ’黑头Sun Bird‘ + len(Name) + 5 + 'dseloffc-012-OK' + 'Name'
但是这里并没有生成85的方法,即使输入了上边正确的序列号,也只多了3E。
原因是上面分析都是单击panel后进行的,没有测试双击情况
现在测试一下,删除所有软件断点(因为都是单击事件的断点)避免干扰,然后把上边硬件访问断点改成硬件写入断点,因为我使用访问断点的时候无法成功触发。

结果很明显,这里直接赋值为0x85。
因此成功注册需要正确的字符串和双击panel1
下面编写注册机
注册机编写
import pyperclip
Name = input("请输入Name: ")
Serial = '黑头Sun Bird' + str(len(Name) + 5) + 'dseloffc-012-OK' + Name
pyperclip.copy(Serial)
print("生成成功,已复制到剪贴板")
print(f"您的序列号为: {Serial}")
双击,注册成功

浙公网安备 33010602011771号