我最近读了一篇关于程序员保护游戏免受盗版的聪明方法的文章,例如Game Dev Tycoon的创建者。这让我感到好奇:他们如何检测到运行的游戏副本实际上是技术层面上的盗版版本?通过一些研究,我能找到的最接近的答案是SNES盒式磁带如何检测是否被盗版,但是这种策略显然不适用于PC。
我最近读了一篇关于程序员保护游戏免受盗版的聪明方法的文章,例如Game Dev Tycoon的创建者。这让我感到好奇:他们如何检测到运行的游戏副本实际上是技术层面上的盗版版本?通过一些研究,我能找到的最接近的答案是SNES盒式磁带如何检测是否被盗版,但是这种策略显然不适用于PC。
Answers:
首先,第一件事:计算机无法知道文件是否被盗版。盗版是一个法律/道德术语,因此,它在文件中没有任何意义,该文件仅由1和0组成。
也就是说,防盗版和对策通常集中在找出用户是否具有某些东西(通常是物体),这些东西只有在购买了游戏副本后才能获得,并且很难复制。有很多方法可以做到这一点,每种方法都有其优点和缺点。我会提到一些:
早期的游戏要求用户输入游戏手册中的单词,只有在您购买游戏盒后才应该输入。复印机或扫描仪很容易使这项技术失败。
最近,媒体检查更为普遍。这个想法是,您需要将游戏CD放在驱动器中才能运行游戏。为此,您可以例如从CD访问关键数据文件,如果没有这些文件,游戏将无法运行,或者仅检查CD中是否存在文件。当CD难以复制时,这种方法效果很好,但是CD复印机和最新的驱动器仿真器可以轻松击败这些技术。
但是,CD副本并不完美,因此许多其他技术都专注于检测CD是原始压制的CD还是副本。为了实现这一点,游戏可以检查在按下时插入到游戏光盘上的非标准元素,但是这些CD-R上的CD刻录机无法轻松可靠地复制这些非标准元素。一些常用的方法是:
在刻录过程中在CD中创建虚拟的“ ghost”文件,这些文件无法从CD文件系统访问,但是确实存在,如果您知道在哪里可以找到它们,则可以读取。逐个文件的光盘副本上没有此数据。复制整个光盘映像将复制这些文件。
另一种方法是有意在光盘中插入错误。CD包含纠错码。通过在数据中插入错误(可以通过光盘读取器进行透明纠正),光盘将可以正常工作,但不会将错误复制到CD-R中。通过查找这些故意错误,游戏可以将CD视为原始印刷品。RAW光盘映像副本克服了这个问题。
在向前和向后搜索数据时,插入具有相同地址但不同数据的双扇区将产生不同的结果。检查这是否存在是可能的,并且用这两个扇区复制CD非常困难。
测量 CD中凹坑的实际位置。再说一次,在凹坑位于相同位置的情况下复制CD非常困难。
但是,许多CD模拟器(例如Daemon Tools或Alcohol 120%)实际上可以模拟这些功能。因此,许多发行商选择包括CD模拟器检测步骤,并在检测到模拟器时阻止游戏运行。但是,仿真器检测器的实现超出了此答案的范围。
除了检查物理CD之外,或者除了检查物理CD外,游戏还可以要求用户输入一些数据,例如产品密钥。使用产品密钥的一些方法是:
检查密钥中的数学特征。但是,这并不能防止重复密钥,如果发现了检查算法或对其进行了逆向工程,则盗版者可能会随意创建看起来对游戏合法的新密钥。随意创建密钥的软件称为“ keygens ”。
根据用户的硬件生成哈希,将该哈希和产品密钥(通常称为“安装密钥”的组合)发送到游戏公司拥有的服务器,然后根据哈希和序列号创建激活密钥。使用单向数值方法(例如模块化算术或某些具有椭圆曲线的方法),游戏可以查看激活密钥是否与哈希码和序列码匹配,并且仅在它们匹配时才运行。此技术称为“激活”。
通过激活,服务器可能拒绝为具有相同序列代码的多个硬件哈希提供激活密钥。因此,即使复制了序列号和激活密钥,激活密钥也不会匹配,游戏也无法在其他计算机上运行。
所有这些措施旨在确定用户是否拥有游戏的购买副本。但是,实现它们需要程序代码对此进行检查。盗版者可能会修改游戏代码以禁用或绕过检查,而不是攻击复制保护机制本身。修改游戏二进制文件以删除反盗版检查的行为称为“破解”。
破解可以简单地包括以下步骤:分解游戏可执行文件,找到进行相关检查的位置,对其进行修改以禁用检查或忽略结果,然后重新进行组装。应对裂纹的一些方法是:
用一些哈希检查二进制文件。但是,必须有一个检查哈希的程序,该哈希也可以被破解。
加密程序或简单地检查例程,然后在运行时解密。这使拆卸更加困难,因为它涉及一个或多个其他解密步骤。如果解密密钥包含在程序中(必须这样做,因为没有密钥就不能对游戏进行解密),那么盗版者可以对解密进行反向工程,查找例程并破解复制保护。
因此,作为游戏发行商,您希望使密钥尽可能地难以找到,并有选择地使解密算法难以理解。使密钥难找的一些方法是:
通过以奇怪的方式创建它来掩盖它。这只是减慢了破解过程。
创建每台机器的主密钥,类似于上述的串行保护。
但是,无论使用哪种方法来创建密钥,解密过程中密钥本身都会存储在内存中。内存检查器,调试器和仿真器可以帮助盗版者在内存中查找和复制密钥。内存偷看可以通过以下几种方式进行攻击:
攻击盗版的技术很多,从琐碎到深奥不等。不幸的是,所有这些技术都可能无法识别出真正的副本,通常是更具攻击性的技术具有更高的假阳性率。
作为游戏发行商,您通常希望选择一套技术,这些技术的实施成本,预期的破解时间和误报率与您的期望相符。
一个普遍的误解是,盗版保护本来是坚不可摧的。大多数游戏销售发生在发布后的前几个月,因此,如果盗版保护计划花费了足够的时间让游戏发行商在被破坏之前收集大量利润,那么盗版保护计划通常被认为是有效的。
关于Game Dev Tycoon,他们没有使用任何反盗版技术。正如您提到的文章开头所述,他们只是创建了一个“中断的”构建,并通过BitTorrent进行了分发。
这很容易,您只需要在自己的可执行文件上运行MD5或SHA256,然后,当您在构建最终版本后检测到签名已从硬编码更改为二进制文件时,就很明显有人入侵了您的可执行文件。然后,大多数公司不再只是显示弹出窗口(以前是这种情况),说“ PE破损”或“检测到病毒”,然后退出游戏,因为这将很快被黑客破解。由于游戏在对话框的消息循环上暂停,因此可以立即查看由于弹出了哪个分支而导致的对话框,并且只需在条件检查中更改代码即可跳过该分支。
如今,公司在游戏玩法上进行了非常细微的改变,例如增加怪物的寿命来使游戏无法玩,或者难以置信地将其巧妙地集成到了该管理游戏中。在这家游戏公司中,您经营着一家游戏公司,最终因为太多的玩家在盗版您的游戏而松了一口气。在这种情况下,很好。有时,它只是使您在公司服务器上上传了一个危险信号,并且当您想致电他们寻求支持时,您会发表演讲,或者被困于泄露您的身份。
但这只是主题,技术就是哈希。而且这些检查可以在二进制文件中的许多地方运行,因此,如果黑客找到了一个并清除了它,那还不够。
编辑:如果您仅按原样复制游戏,则该游戏如果根本没有任何反盗版措施,则可能会起作用。它与CD刻录机时代之前的非常古老的游戏一起使用。因此,在大多数情况下,必须安装游戏才能运行,而不仅仅是复制安装文件夹。这涉及到在系统中随处可见的隐藏文件和注册表项。游戏会检查这些东西的存在,这些东西只能由安装程序创建。而且安装程序只能从CD上运行,由于无法正常复制位而导致它们无法复制,因为这些位不稳定,不尊重光盘首字节处的纠错码系统,这会杀死大多数CD播放器驱动程序。某些复制软件(例如酒精的Nero)建议您忽略这些错误,但是它们所燃烧的是正确的副本,安装程序会检测到该错误,然后您又去了。
编辑2:
问:如何对文件进行哈希处理,然后将哈希插入到更改哈希的文件中?
@ Byte56:该死的,我们在这里得到了聪明的评论:)是的,这是一个悖论,无法解决。因此,必须在不包含哈希的二进制文件部分进行哈希。而且校验码必须知道这一点,以便在哈希到自检时排除该区域。我见过人们在使用标签,例如~~ #### [在此处输入哈希值] #### ~~将其哈希值括起来并进行排除。但是它具有容易被黑客发现的缺点,因此必须对哈希进行加密,并将其分散在多个位置。甚至加密为什么不加密,相同的伪装操作也用于存储私钥。