如果把所有内容都放到一起那文章就太长了,既不好读也不好写,所以内容被我分成了两部分,本篇是第一部分,包含第三到第六代游戏机的破解历史。
除去 DOS 或者更早的 Commodore 上软件的的各类复制保护,任天堂在雅达利大崩溃后制造的的 NES 防破解芯片可以说是第一个游戏机保护系统。这些保护系统为了维护厂商利益而限制了用户的自由。有限制就会有人尝试去破解。也许是为了玩盗版游戏,也许是为了在不花钱或者签合同的情况下利用游戏机硬件运行自己编写的程序,不同的破解者为了不同的目的都在研究这些安全系统,并期望破解它们从而让游戏机不受限制的发挥光荣。
本章省流部分
- 大部分没有可以更新的系统甚至没有系统的游戏机破解都是通过绕过保护系统进行的,这些较老的机器上的很多机制反倒比更新的机器上的机制更难破解。
- 字符串溢出漏洞总是一次一次又一次出现。
- 大部分密码学知识对游戏机系统开发者实在是太难了,他们整明白有可能但整明白不太可能。
第三世代-保护系统的开始
从这一代的 NES 开始,游戏机上的保护系统才算正式出现,而 NES 也是这一代唯一一款具有保护系统的主机。
NES
保护机制
10NES,或者叫做 CIC,实际上只存在于北美的NES 上,而 NES 的亚洲版本,FC 并没有这款加密芯片,所以亚洲大区的 FC 有很多邪门的卡带。因为这款芯片不存在于 FC 的原始设计里,而是在准备向北美发布的过程中添加的,所以并未整合到系统之中。相反,它外挂到 CPU 的 Reset 针脚上并和卡带槽连接,在开机后和卡带内的对应芯片通过连接的针脚不断认证。如果认证失败,它就会以每秒一次的频率重启 CPU,让盗版卡带无法使用。
破解
虽然用户自己想要干掉这块后黏上去的破解芯片很容易,把它到 Reset 的连接断开让他别狗叫了就轻松秒杀,但是第三方发行商不能这么搞——一是你没法教用户打开机器去施工,二是用户花大价钱买来的机器一改就没保修了,用户想不想改还是个问题。所以这些发行商就想在不让用户改机器的情况下破解这一机制,它们发挥聪明才智,想出来了三个方案:
- 不改主板的情况下干掉这玩意——给 10NES 气(电)晕
- 造不出来可以借——找正版卡带里的芯片替我做认证
- 造个假的芯片
第一个方案主要是某个神棍游戏发行商(Wisdom Tree)发行的作品在用,比如超级神经病作品超级诺亚(听名字就知道抄袭的什么东西)。他们为了电晕 10 NES 而不电死机器,费了很大精力研究如何在不同的机器批次上提供合适的电脉冲电压和脉冲时间。保险起见,卡带内部的破解方法会从低电压短时间开始升级,逐个方案测试。问题是不同机器上的芯片和电路会有一些制造差异,所以这种电晕芯片的方案启动过程不稳定且需要一段时间测试合适的电压和脉冲时间。
第二个方案是最简单的,你的 CIC 也可以是我的 CIC。只要在第三方卡带上留一个接口连接到正版卡带或者从后者里面拆出来的正版验证芯片就行。任天堂的验证芯片只要做认证就好了,但第三方卡带需要考虑的就多了,还需要负责原神启动。显然,这么搞你得去想个办法拾一张原版卡带。
第三个方案——伪造芯片就涉及如何拿到正版芯片的资料,这里有一些雅达利的小故事:为了省去逆向工程的时间和成本,雅达利假装要起诉任天堂侵权,找专利办公室以要打官司的名义拿到了 10NES 芯片的文档,从而制造了叫做 Rabbit 的复制版 10NES。直接复制任天堂资料显然不太合法,所以雅达利不出意外的出意外了:任天堂把它告上了法院。虽然任天堂告赢了,但之后的专利大战和反垄断大战拖延了任天堂干死这一产品的脚步。值得一提的是,2015年终于有人通过开盖芯片完整逆向了原版 10NES 的鉴权算法并进行了复刻。
第四世代-还是原样
这一代的主机在保护系统上没什么技术进步。
任天堂对 10NES 自我感觉良好,而且做个新方案还得花钱不是?所以 SNES 还是在使用和前一代一样的认证方案,无非是部分游戏加了些插桩和硬件规格检查,整的和电脑软件似的。而 SEGA 的 MegaDrive 更是只通过验证卡带里的商标是不是和预期一致来反盗版,他甚至懒得在卡带内做锁区功能,只是把不同区域的卡带外壳做成插不进去的来实现,买个转接头就能马照跑舞照跳。
街机大厂 SNK 做的 NEOGEO CD 防拷贝倒是做的稍微有一点含金量,采用了不太罕见的光盘错误注入法,在光盘的部分地方做了会被普通 CD 机的自动纠错功能修复的错误。这样,如果你用普通 CD 机复制光盘,这些错误就消失了,而复制出来的盘自然也就没法通过验证。
而 PC Engine 的活就比较狠了,虽然没什么防盗版措施,但为了锁区它专门把美区和日本卡带的数据线顺序翻了一下,而且游戏里还做了区域验证,值得在这里给他一个奖励提名。
掌机方面,Gameboy 和 MegaDrive 一样也采用了商标法律大棒验证法。但是这个检测过程中会读取两次Logo,分别用于验证正版和显示启动 Logo,所以有些第三方卡带为了避免被锤选择了卡时间差搞一个(不是)任天堂的狠活显示在机器上。
第五世代-真正的保护措施
土星
安全措施
世嘉土星的光盘在正常CD机无法写入的部分写入了安全数据,描述了光盘上内容轨道的偏移,如果安全数据和偏移则光驱拒绝启动CD。这一认证机制存在于光驱上,系统的其他部分无法控制。
破解
由于验证并非在主机而是在光驱上发生,而且只在启动时验证一次,自然就有下面的几种绕过认证机制的方式:
- 换碟大法:因为游戏启动过程中只会验证一次光盘是不是正版,那我是不是可以拿正版盘做验证,验证之后换成刻录盘?只需要一个正版盘就能做到,但是这么搞比较吃操作,还容易干烂光盘和光驱。
- Modchip:那我是不是可以骗一骗光驱让它觉得它是职业选手,确实是在读正版,或者干脆骗一下主机,让它觉得它在从真的光驱读?但是你还是需要找地方买 Modchip 并且把它焊上去。
- 用卡带破解:软件多少会有点 Bug 的,而土星上的卡带扩展接口不幸就是其中之一,因此有人利用卡带漏洞给机器下了点猛料,干掉了光驱的验证机制。
- 用正版盘切出鉴权部分,并粘到 SEGA 自己提供的开发用盘上,开发用盘启动后会关闭土星的鉴权机制。(只能说想出这个制造缝合怪光盘的方法的人,神人程度和 Xbox 360 上给光驱闪存打洞的差不多了。)
PlayStation
安全措施
PlayStation 的光盘防复制措施和土星的很相似,也是采用了在一般 CD 机无法写入的地方刻录额外内容的方式来防盗版。具体来说有两部分:较老的 PlayStation 只会校验额外内容里的区域字符串,如果不匹配就拒绝启动,而一般方法刻录的盘显然没有这些东西。新一点的机器还有一个额外检查,PlayStation 里的启动界面文本是从光盘里读取的,新机器也会校验这一部分的内容。
另外,在更新的游戏中还加入了叫做 libCrypt
的检验措施,通过在光盘中故意制造校验失败的区域来编码一个 16 位的密钥做验证。更晚的游戏在后期 PlayStation 上另外还有一个措施,它会不断请求区域字符串,设计的不好的 Modchip 会再次注入,但真正的光驱并不会这样做。
破解
自然,相似的问题有相似的解决方案,PlayStation 也存在换盘和 Modchip 修改,还有一个利用了早期 PlayStation 的并口的破解卡带(Action Replay)。换盘利用了光驱读不出来数据时的纠错机制,只要你足够快的把正版游戏更换成复制盘就能继续游戏。而 Modchip 这里则有一个对抗的过程,一开始只是通过向光驱注入假的区域代码实现绕过,后来光盘内添加了 Modchip 检测,于是新的 Modchip 一部分通过成功启动后自闭的方法来防止检测,另一部分直接利用 PlayStation 的换碟机制,换碟是给有多张光盘的游戏准备的,为了节省时间,新换的光盘并不会被再校验一次。
之后就是利用 BIOS 漏洞进行的软改:PlayStation 的固件有管理记忆卡的功能,而且会假定里面目录部分存储的文件大小和指针一定是真的,还没有做任何溢出检查,下面就是经典的故事了。而且人们还发现 PlayStation 的光驱有一组隐藏指令,能完全关闭任何校验功能,两者结合就制造出了最终的破解方案:FreePSXBoot,它利用记忆棒漏洞持久化破解,之后只要在匹配的机器上插入记忆棒就为所欲为了。扩展阅读:PlayStation 固件漏洞说明
N64
安全措施
又到了擅长搞神奇操作的任天堂同学环节。好消息是:因为这款游戏机用的是卡带而不是光盘,任天堂不用和 CD 刻录机较劲。但是还是会有人制造假卡带。这次的反盗版措施是一款内置于 N64 的 I/O 控制器芯片里的校验芯片。这款校验芯片和 NES 上的亲戚类似,通过和卡带里的对应芯片不断进行基于 CRC 算法进行挑战-响应来做正版验证。启动过程中,N64 的固件会先将主 CPU 扔到无限循环中,等待 CIC 完成校验才会恢复正常启动流程。
破解
和 NES/SNES 一样,去正版卡带上偷一个能启动的芯片就行了。后期也有人搞出来了假的认证芯片就是。
第六世代:防拷贝最后的荣光
本代是最后一代主要靠防拷贝机制来防止破解的主机世代,之后的游戏机几乎都在防拷贝机制的基础上加入了对代码内容的检查,防止绕过机制后直接就能获得任意代码执行能力。
Gameboy Advanced
Gameboy Advanced 的防破解措施是和 Gameboy 相似的卡带启动商标检验,基本上属于靠法院防盗版。
Dreamcast
安全措施
日本人经常把门修的比墙结实:Dreamcast 本身使用的 GD-ROM 是一个 SEGA 以外的人难以制造的光盘格式,但它为了提供卡拉OK功能还支持了 MIL-CD,SEGA 显然猜到了 MIL-CD 可能会被人拿来破解,因此对 MIL-CD 上的启动文件进行了加扰,如果机器检测到光盘是普通 CD,就会从打散的位置读取启动所需的内容。如果写入的文件没被正确的打散,游戏机就会读出垃圾代码而崩溃。
破解
不幸的是,Dreamcast 开发套件被送到了他不该去的地方,而且其中还提供了MIL-CD 启动文件的加扰/还原工具。有人很快通过分析这些工具得到了制造能启动的 CD 的方法,并制作出了可以从 SD 卡或者普通刻录光盘读取数据的启动盘。甚至还有人做出了可以直接刷写 BIOS 从而永久破解机器的光盘。SEGA 发现了这个破解方式,并在更新的机器上去掉了 MIL-CD 的支持。但是破解已经给 SEGA 和游戏开发商造成了足够的损失。这一问题和 Dreamcast 的奇怪架构设计让游戏开发者和 SEGA 失去了支持它的动力,并最终让 Dreamcast 成为了 SEGA 最后一代主机。
PS2
安全机制
PS2在PS1的光盘认证设计基础上又升级了安全措施,增加了从光盘上的内容中获取产品编码并逐级解密启动Logo的流程,如果解密出来的Logo验证不通过则拒绝启动。
又是ModChip
自然,由于校验是在游戏机启动时发生而在运行时并没有太多校验,经典的 Modchip 方案又回来了,只不过初期的还是需要用换盘方案辅助操作,之后升级的 Modchip 省去了换盘操作。
不想当焊工
显然不是所有人都想当会当焊工,自然有人推出了消费升级产品:只要插入光盘就能破解。由于这一时期的游戏机基本上没有真正的操作系统,游戏软件加载完了之后对机器想干啥就干啥,只要制造出来能通过验证的光盘就能从别的地方读取游戏并运行,或者干脆可以换张光盘玩。之后还有人利用光驱的错误重试机制做出来的能停下光驱的 SwapMagic 光盘,这样换盘就不需要在光驱还在转的时候拔盘插盘了。
脱离换盘
焊接和换盘都太麻烦了,有没有不需要操作有手就能玩的办法啊?有的兄弟,有的。最开始的方案来自于一个字符串溢出漏洞:当在 PS2 上运行 PS1 游戏时,游戏机固件会尝试从记忆卡里读取存档,而且如果存档中有 TITLE.DB
这个配置文件,游戏机固件会尝试加载并解析这个文件。然而解析文件过程中存在一个溢出问题(请记住这时候还不怎么存在地址随机化,加载地址是可预测的),能够把返回地址指针覆盖掉,之后就拿到了在 PS2 上随便执行代码的能力。然而索尼在 V11 之后的固件修复了这一问题。
但是,索尼还在 PS2 上做了一个非常抽象的系统升级功能:允许用户从光盘安装系统升级到存储卡里。但是 PS2 内部没有能写入东西的地方,拔掉存储卡系统自然就变回出厂版本了。想明白了系统升级没啥用的事实后,索尼就再没有再使用这个升级功能,但是索尼也没把它删掉。既然你没删掉我就要用了,于是就有了 FreeMCBoot,它在记忆棒中伪装成系统更新,替换了 PS2 的整个固件,彻底攻破了安全系统。
GameCube
GameCube 终于(暂时的)摆脱了卡带,使用上了容量更大而且更便宜的光盘。值得一提的是,Gamecube 有一个可重新编程微码的 BSP。
安全措施
Gamecube 有一个非常复杂的光驱固件来控制光驱执行正版验证,验证过程涉及到校验冲切区的编码,而光驱只对主机系统提供了读取数据的接口,所以系统在不改动光驱硬件或软件的情况下无法读取没有通过光驱认证的光盘。
除了光盘上的安全措施,为了防止黑客分析或修改启动固件,任天堂对系统的启动固件也做了加密处理,但是任天堂的加密系统不出意外的出意外了。
破解
光驱或者绕过光驱?这是个问题
如果你的认证功能在复杂的光驱固件而不是主系统里实现,最简单的绕过办法就是制作光驱模拟器或者修改光驱固件。因此最早出现的破解自然就是各种各样的 Modchip/模拟器。
另一种做法则是绕过光驱,通过别的方式读取游戏,也就是利用漏洞加载自制程序,之后通过其他接口读取内容并执行。这方面除了利用某些游戏加载并解析的漏洞之外,还有利用幻影之星在线的 bug 执行。开发幻影之星在线的神人公司实现了一个下载可执行文件来进行更新的功能,但并没有给它添加任何安全措施。因此只要中间人攻击一下就能通过这个功能执行任意代码。而且可以直接从你的电脑下载任意程序,相比利用存档 bug 更加方便。
靠混乱来保密是不会长久的
而加密的固件实际上也没给任天堂争取到太多时间,他们在固件的加密方式上犯了两个重要错误:
- 由于任天堂在解密固件时生成的密钥流是固定的,把两个不一样但都加密的固件异或一下就能拿到两个固件之间明文的异或。
- 更大的问题是,EXI 总线的设计导致每个周期两边要各发送一个数据出去,如果你只需要接收对面的数据,就得在那个周期上发送一个垃圾数据。由于任天堂硬件工程师的抽象设计,被发送的这个垃圾数据是之前解密出来的的固件数据。所以给总线挂个探针就能从这些垃圾数据里还原出来一部分固件内容。
第二个问题提供了固件一半的前0x700内容,还有之后的绝大部份内容。利用这部分抓到的内容,还有第一个问题提供的合成游戏机能够接受的代码的能力,可以注入能够提供固件剩余内容的代码,从而重建除了第一个指令以外的整个固件内容,并利用这些内容进行逆向工程,制作出带有大家想看的东西的固件。最后,只需要把修改过的固件装到 ROM 里替换掉原设备的固件就可以了。
Xbox
安全措施
由于 Xbox 的设计和制造是赶时间赶出来的,微软直接把普通电脑的硬件,还有大家最爱的操作系统-Windows 的组件软件缝合在一起,临时攒出来了这么一台主机。
虽然 Xbox 就是个超级魔改普通电脑,但微软显然不想让买它的人把它当一台微软百亿补贴电脑,更不想让每个人随便刻个盘就能玩游戏,所以设计了一个非常复杂且相对安全的系统。
首先,由于这台机器的 CPU 就是一款奔腾3,它会且只会从地址空间里的 0xFFFFFFF0
启动。微软为了严格限制 Xbox 能运行的内容,需要从启动开始构造信任链,因此需要把固件隐藏起来。开机时首先读取固件 ROM 中的内容,并用存在于英伟达给这台主机定制的 MCPX 芯片内的代码覆盖头部 512 字节。主机在读取完第一阶段存在于 MCPX 闪存中的代码后会立即屏蔽这部分代码的读取,防止被人读出并分析。这段代码会解密之后的固件内容,并把启动流程转接给它。第二阶段的固件负责验证光盘内容。
光盘方面,Xbox 在光盘的不能被一般光驱读取或写入的外圈超刻了真正的描述表,而一般的 PC 光碟机只能读到内部的假的描述表,和它描述的一点点提示视频。除了超刻内容之外,Xbox 还在光盘内加入了专门用于安全的区段:DVD播放机固件会读取其中的 Challenge 并向主机进行验证请求,只有请求成功后才会继续读取磁盘内容。另外安全区段内还有用于生成光盘内容解密密钥的信息以及光盘内容的签名,当它们全部匹配时才能读取并解密光盘内容。
破解
那我问你,你的安全措施这么全,应该不太容易被破解吧?
MIT 高材生
然而 Xbox 是一台赶工出来的魔改 PC,它显然不支持直接读取加密内容,必须得有一部分代码负责解密这些东西。Intel 手册中有它的启动地址,因此人们在闪存里查找这个东西。一位 MIT 博士生,Andrew “bunnie” Huang,dump 了 Xbox 的闪存内容,然后在本应该被覆盖掉的前 512 字节发现了 x86 机器码,这段疑似是工程遗留的东西里有一段疑似 RC4 解密的代码(后面发现是 RC5 算法,但当时 RC5 是不公开的,是 RSA 公司的商业机密),但是这段解密代码对于普通 Xbox 不起作用。在实验过程中,他发现这部分代码被擦掉之后 Xbox 还能启动,说明 Xbox 在别的地方存储了启动代码。之后他利用 MIT 硬件实验室的资源做了个嗅探器,通过监听 Hypertransport 总线获取了 MCPX 中的 ROM 内容。
密码学神人操作
这段 ROM 内容让人们发现 Xbox 的验证机制验证了个寂寞:由于它用的加密算法是 RC4,而 RC4 这个密码并没有明文反馈,所以改变一位明文只会改变对应一位的密文,让微软验证解密后内容结尾的操作什么也没验证。同时其中还有第二阶段固件的解密密钥。
很快就有人做出来了能给系统打补丁干掉验证机制的固件,只需要把它焊接在原来的闪存位置就行。另外其他人还发现,闪存芯片不存在的时候机器会试图从 LPC 接口上接的芯片来启动,可以利用这个特性做出焊接起来更简单的 Modchip。
顺带一提,微软在更新后的 Xbox ROM 把加密算法换成了 TEA,然而在一本 1996 年就出版的应用密码学书籍里就写明了不要拿 TEA当哈希算法:如果你同时反转一组 32 位数据的第 16 和 31 位,之后的数据还是会不变,结果大家还是有办法能改掉固件内容。(不过不要嘲笑微软,之后我们会看到任天堂的大聪明也干了。)
手册不看全,发布两行泪
另外,初始化 ROM 中还存在几个问题,其中之一是 Visor 发现的:微软为了在校验不通过时死机做的操作。他们试图让程序计数器指针溢出来让 CPU 抛出异常,同时因为异常处理程序在这时根本不存在,CPU会停机。
但是 Xbox 在原型阶段用的是 AMD 处理器,而生产阶段使用的是 Intel 处理器,两者在这方面行为并不相同,后者在程序计数器溢出时并不会报错,而是继续按溢出后的地址执行,这样就能让它继续按照闪存中的原始内容运行。
软件破解
上面的方法都涉及到魔改硬件,那么有没有软件方法来破解 Xbox 呢?
由于大部分游戏程序员都是喇叭,很多游戏在处理存档时都存在或多或少的漏洞,这样用一个损坏了的存档就能拿到执行代码的权限。但是这样操作需要每次先打开有漏洞的游戏。
直到大家发现 Xbox 控制面板也有漏洞,Xbox 控制面板启动时会从硬盘上拉取数据,虽然存储的大部分内容都有签名,但字体文件没有,而微软在处理字体方面的安全性是出了名的差。
然后就是微软的奇异搞笑时刻:
- 微软先是升级了 dashboard 修复了漏洞,然后用户又把旧版 dashboard 拷贝回来解决问题。
- 微软在内核里把有问题的 dashboard 拉黑了,但是没关系,Xbox 的 Xbox Live 配置程序也有一毛一样的漏洞
- 微软又把旧版配置程序拉黑了,但是所有支持 Xbox Live 的游戏里也有同样的程序,并且这个程序能直接从硬盘里运行,把那个程序拷回来就完事了。
- 然后微软就没活了,因为拉黑这个新的程序会让这些游戏全都不会弹。

游戏结束,微软输了。
致谢
本文编写过程中参考了大量的资料,包括但不限于 Wololo, ConsoleModsWiki, GC-Forever, N64Dev, GBATemp, XboxDevWiki, Rodrigo Copetti 的实用分析, 以及混沌电脑俱乐部的混沌沟通大会中的部分演讲及 PPT