我有一堆旧软件的序列号和它们对应的激活密钥。自从最初安装它们以来,我丢失了一些激活密钥(但仍然有序列号)。我仍然有一个大约 20 个键的数据集,甚至目不转睛地观察它,我可以看出有一种方法可以疯狂地确定激活键。鉴于我的数据集很大,有没有一种方法可以反解来找出丢失信息的激活密钥。
序列号示例:14051 激活密钥:E9E9F-9993432-45543
我有一堆旧软件的序列号和它们对应的激活密钥。自从最初安装它们以来,我丢失了一些激活密钥(但仍然有序列号)。我仍然有一个大约 20 个键的数据集,甚至目不转睛地观察它,我可以看出有一种方法可以疯狂地确定激活键。鉴于我的数据集很大,有没有一种方法可以反解来找出丢失信息的激活密钥。
序列号示例:14051 激活密钥:E9E9F-9993432-45543
您要做的是想出一个将序列号映射到激活密钥的功能。在不了解函数性质的情况下,这可能是从非常简单(只有几个项的多项式)到非常困难(涉及大量块 XOR、替换表、复杂键调度等的多层函数)的任何地方。 .)。
如果您有权访问密钥验证程序(例如通过反汇编 - 这几乎总是根据商业软件的 EULA),那么您有一个例程返回给定的激活密钥对于给定的序列号是否正确。如果这是通过计算序列号的激活密钥来完成的,那么您实际上已经完成了。如果这是通过计算密钥上的反函数来完成的,那么您的任务会稍微困难一些:您需要反转该函数以检索密钥派生算法,这可能并不那么容易。如果你最终不得不解决一些困难的数学问题(例如离散对数问题),因为该方案依赖于公钥加密,那么你希望你正在处理的值足够小,你可以蛮力或在计算可行的时间内使用已知算法(例如 Pollard 的 rho 算法)。
在任何情况下,您都需要熟悉反汇编和调试,并希望没有反调试器措施到位。
否则,问题就更难了——你需要做出一些有根据的猜测并尝试它们(例如,通过尝试进行多项式拟合),并希望最好。由于可以适应任何一组输入和输出的不同可能函数种类繁多(数学上不可数,但实际上受源代码大小的限制),试图对算法本身进行已知明文攻击通常是不可行的。
这首先取决于该计划的愚蠢程度,但我的猜测是这不太可能。没有固定的方法,但一般领域与密码破解相同。