我的意思是,我一直想知道有人到底是如何开发算法来打破/欺骗许多共享软件程序中合法使用的限制。
只是为了好奇。
除了非法之外,这是一项非常复杂的任务。
只是在理论上讲,常见的方法是反汇编程序进行破解并尝试找到检查密钥或序列码的位置。
说起来容易做起来难,因为任何严肃的保护方案都会检查多个位置的值,并且还会从串行密钥中获取关键信息以供以后使用,这样当你认为你猜到了它时,程序就会崩溃。
要创建破解,您必须识别完成检查的所有点并适当地修改汇编代码(通常反转条件跳转或将成本存储到内存位置)。
要创建密钥生成器,您必须了解算法并编写程序来重新执行完全相同的计算(我记得旧版本的 MS Office,其序列号有一个非常简单的规则,数字的总和应该是7,所以编写 keygen 相当简单)。
这两个活动都要求您在调试器中跟踪应用程序的执行并尝试找出正在发生的事情。而且您需要了解操作系统的低级 API。
一些受到严格保护的应用程序对代码进行了加密,因此无法反汇编文件。它在加载到内存时被解密,但是如果他们检测到内存中的调试器已经启动,他们会拒绝启动,
从本质上讲,这需要非常深入的知识、独创性和大量时间!哦,我有没有提到这在大多数国家都是非法的?
如果您想了解更多信息,请参阅 Google 的 +ORC 破解教程,它们非常古老,现在可能已经无用,但会让您很好地了解它的含义。
无论如何,了解这一切的一个很好的理由是如果您想编写自己的保护方案。
坏人使用反汇编程序搜索密钥检查代码。如果你知道如何做到这一点,这相对容易。
之后,您将密钥检查代码翻译成 C 或其他语言(此步骤是可选的)。逆向检查密钥的过程为您提供了一个密钥生成器。
如果您知道汇编程序,大约需要一个周末来学习如何做到这一点。几年前我已经完成了(虽然从未发布过任何东西。这只是对我的游戏开发工作的研究。要编写一个难以破解的密钥,您必须了解人们如何破解)。
Nils 的帖子涉及密钥生成器。对于裂缝,通常你会找到一个分支点并反转(或删除条件)逻辑。例如,您将测试该软件是否已注册,如果是,则测试可能会返回零,然后进行相应的跳转。您可以通过修改单个字节将“如果等于零 (je) 则跳转”更改为“如果不等于零 (jne) 则跳转”。或者,您可以在代码的各个部分编写不执行您不想执行的操作的操作。
编译后的程序可以反汇编,只要有足够的时间,有决心的人就可以开发二进制补丁。破解只是一个二进制补丁,可以让程序以不同的方式运行。
首先,大多数复制保护方案都不是非常先进,这就是为什么你现在看不到很多人推出自己的方案。
有几种方法可以做到这一点。您可以在调试器中单步执行代码,这通常需要具备相当的汇编知识。使用它,您可以了解程序复制保护/密钥生成方法的调用位置。这样,您可以使用IDA Pro之类的反汇编程序更仔细地分析代码,并尝试了解发生了什么,以及如何绕过它。我之前通过在日期检查中插入 NOOP 指令来破解限时 Beta。
它实际上只是归结为对软件的良好理解和对汇编的基本理解。 Hak5在本季的前两集中制作了一个由两部分组成的系列,内容是关于逆向工程和破解的基础知识。它真的很基本,但它可能正是您正在寻找的。
一个潜在的破解者会反汇编程序并寻找“复制保护”位,特别是用于确定序列号是否有效的算法。从该代码中,您通常可以看到解锁功能所需的位模式,然后编写一个生成器来创建具有这些模式的数字。
另一种选择是寻找如果序列号有效则返回“true”并且如果序列号无效则返回“false”的函数,然后开发一个二进制补丁,以便该函数始终返回“true”。
其他一切基本上都是这两个想法的变体。根据定义,复制保护总是可以破坏的——在某些时候你必须得到可执行代码,否则处理器无法运行它。
您可以提取算法并开始对其进行“猜测”并寻找积极响应的序列号。计算机功能强大,通常只需要一点时间就可以开始输出热门歌曲。
至于黑客,我曾经能够在高层次上单步执行程序并寻找它停止工作的点。然后你回到最后一个成功的“呼叫”并进入它,然后重复。那时,复制保护通常是写入磁盘并查看后续读取是否成功(如果成功,则复制保护失败,因为他们曾经用激光刻录软盘的一部分,因此无法写入)。
然后只需找到正确的调用并从该调用中硬编码正确的返回值即可。
我敢肯定它仍然很相似,但是他们付出了很多努力来隐藏通话的位置。我尝试的最后一个我放弃了,因为它一直在我单步执行的代码上加载代码,而且我确信从那时起它变得更加复杂。
我想知道为什么他们不只是分发个性化的二进制文件,其中所有者的名字存储在二进制文件中的某个地方(加密和混淆),或者更好地分布在整个二进制文件中。AFAIK Apple 正在使用来自 iTunes 的音乐文件执行此操作存储,但是从文件中删除名称太容易了。
我假设每个破解都是不同的,但我猜在大多数情况下,有人会在调试器中花费大量时间来跟踪相关应用程序。
串行生成器通过分析检查序列号的有效性并对其进行逆向工程的算法,更进一步。