« Wii架构 (index)

Wii架构

Chapter 10: 反盗版&自制软件


目录

  1. 复制保护
  2. 系统加密
    1. 共享加密
    2. 信任链
    3. Starlet的信任链
    4. 更多密钥
    5. 观察
  3. 加密系统的陨落
  4. 自制软件的曙光
  5. 永久状态
  6. 任天堂的回应

我认为,这款游戏机提供的大量功能对黑客来说非常有吸引力,因为破解安全系统可以让自制游戏开发者无需通过任天堂的检查就能获得游戏机的功能。 尽管如此,Wii最终还是拥有了一个非常棒的自制软件库。

复制保护

让我们从常见的受害者开始:光驱

Wii光盘包含前面提到的"冲切区",传统光驱无法访问该区域。 因此,如果没有这个区域,驱动程序将始终拒绝读取内容。

Image
在插入有效光盘之前,光驱不会让任何人通过这个屏幕

改机芯片开发人员发现,光驱包含一个名为"串行写入器"的调试接口,不过在输入密钥之前,这个端口是锁定的。 不过,密钥迟早会被发现。 一旦出现这种情况,改装者就能禁用复制保护,并随后开发出一种能自动完成这一过程的改装芯片。

松下发布了该光驱的进一步修订版,对调试界面进行了混淆,然而,读取器中的其他缺陷也被发现,从而再次使其失效。

值得一提的是,由于光盘内容仍被加密,改机芯片的主要好处是可以进行简单的盗版,因此需要更多的研究和工具来运行自定义代码。

另一方面,GameCube自制游戏已经可以通过以前在前代产品上发现的漏洞来执行。

系统加密

这可能是这款游戏机最复杂的部分,然而对它的永不停歇的研究却为许多才华横溢的开发者和令人惊叹的程序打开了大门。

Wii围绕几种加密算法(AES、RSA、ECC、SHA-1和HMAC)设计内部安全。 为了便于解释,我们将分别介绍每一组密码:

共享加密

许多组件(NAND、游戏光盘和SD卡)之间的通信都经过加密,以避免被篡改。 任天堂选择了对称密钥系统来保护它,这意味着Wii使用相同的密钥来加密和解密数据。

Starlet的OTP存储器中存储有三个128 位AES密钥,这些密钥在制造过程中只写入一次:

由此我们可以看出,Starlet负责加密/解密合理的内容,这就是为什么只有这个CPU可以访问机密数据的原因。

信任链

标题包含另一层安全机制,即RSA-2048。 这是一种非对称密码,意味着我们需要一个密钥来加密内容,另一个密钥来解密内容。 一言以蔽之,任天堂可以使用未公开的密钥(称为"私钥")对游戏进行加密,而Wii则使用存储在游戏机中的"公钥"进行解密。 如果黑客获得了公共密钥,也不足以破解安全系统,因为数据仍然要使用只有任天堂知道的私人密钥进行加密。

此外,RSA不仅用于加密内容,还用于检查加密的完整性。 任天堂使用多个密钥对已加密的数据进行签名(加密),形成一个加密链,目的只有一个,那就是确保加密的完整性:

让我举例说明其工作原理:

  1. 任天堂创建了一个名为x的密钥。
  2. 任天堂对Starlet进行编程,使其只信任使用x密钥签名的内容。
  3. 如果Starlet发现自己需要解密一个密钥为y的文件,那么只有在yx密钥签名后,它才会继续解密。

这就是所谓的信任链。 在Wii之外,这种技术通常用于保护我们在全球范围内的大部分通信(例如,使用HTTPS的网络浏览器依靠"根证书"来验证未知证书的真实性)。

Starlet的信任链

Starlet的OTP存储的是公钥(也就是说,就我们的目的而言,它只能解密和验证内容的签名)。 它的信任链由以下密钥组成:

如你所见,所有这些都使任天堂成为内容的唯一发行商,这对担心盗版的游戏工作室来说是件好事。

更多密钥

该系统还包含一对ECC私钥和公钥。 椭圆曲线加密法(Elliptic Curve Cryptography,ECC)是另一种与RSA相似的算法。 在本例中,它仅用于签署通过SD卡传输的内容。 这样可以防止从一个Wii复制的内容被另一个Wii使用。

ECC密钥由另一个名为MS的RSA公钥签署,这样Starlet就可以信任ECC密钥。

游戏机使用的最后一个密钥是HMAC密钥,它使用的是另一种结合了SHA-1哈希值和HMAC的算法。 在启动过程中,Starlet会检查NAND是否被第三方硬件篡改。 为此,它会计算NAND的SHA-1哈希值,并将其与硬连接的哈希值进行比较,检查两者是否匹配。 此外,还使用HMAC密钥对保存的哈希值进行签名,以确保其真实性。

最后要说明的是,HMAC密钥存储在SEEPROM(Starlet外部)中,而不是OTP中。

观察

说了这么多,值得一提的是,当系统运行GameCube游戏时,不会使用上述任何加密方法。 相反,Starlet只会检查游戏是否只能访问指定的内存位置。 这是因为有1/4的GDDR3 RAM被分配用于模拟旧的ARAM

加密系统的陨落

让我们从AES密钥说起,该算法可能很难破解,但如果以某种方式提取了密钥(尤其是通用密钥),这层安全保障就会立即失效。 因此,主要的挑战在于如何提取它们

Image
Starlet的安全机制示意图

一群名为"Team Twiizers"的黑客发现,GameCube模式缺乏签名可能是一个很有潜力的攻击面。 他们不仅发现在运行NGC程序后,3/4的GDDR3 RAM没有被清除,而且还发现通过桥接主板上的一些地址点(使用一把镊子),他们可以交换所选的GDDR3 RAM组,从而访问受限区域。 果然,AES密钥就在其中。

别忘了,这只能解密"第一层"安全机制,但要执行无签名程序(自制软件),RSA也必须被破解。 不幸的是,这在计算上是不可能的...... 除非其实现存在缺陷。 Team Twizzers并没有就此止步,他们开始逆向IOS的编码方式,重点关注其签名验证功能。

RSA签名验证的工作原理是将RSA运算的哈希值与解密后的签名进行比较。 经过一番摸索,小组发现了一个有趣的现象:任天堂使用strncmp(C的"字符串"比较函数)实现了这一功能。

对不熟悉C语言的人提一下,strncmp是一个用于检查两个字符串是否相等的例程。 该方法接收三个参数:两个字符串和一个整数,后者表示要比较的字符数。 然后,strncmp开始比较每个字符,直到字符串的末尾(或字符计数器指定的位置)。 在C语言中,字符串只是一个以\0字符结束的字符链,这意味着一旦任何字符串达到\0strncmp就会停止比较。 因此,如果Wii标题的哈希值在开头包含\0,Starlet 的RSA计算就会发现自己在比较非常短的哈希值(甚至是空哈希值)时,很有可能发生碰撞(不同的数据产生相同的哈希值)。 最终,通过一定程度的暴力破解,比较的结果是相等的......鉴定为标题已签名!

如果这还不够,这个漏洞还在多个IOS版本中被发现,甚至在boot1和boot2的例程中也被发现!

自制软件的曙光

在这之后,就只剩下一件事了: 将漏洞永久化,并开发一款"用户友好型"工具,让它能轻松运行自定义程序。

Image
运行第三方应用程序最初是通过使用被改过存档的游戏来实现的

到目前为止,这些漏洞需要使用额外的硬件,因此并非每个用户都能使用...... 直到Team Twizzers发现了另一个漏洞: 一个游戏缓冲区溢出。

我指的是著名的《塞尔达传说:黄昏公主》(任天堂出品的一款游戏)。 TT发现,该游戏的保存文件可以被修改,以溢出用于命名玩家马匹的字符数。 因此,当玩家试图读取溢出的名称时,就会触发连锁反应,最终导致任意代码执行。 比方说,这可以用来运行程序加载器。

由于签名现在可以伪造,这种伪造的保存文件很容易在网络上传播,供其他人使用。 因此,自制软件社区现在可以执行他们的定制软件了。

永久状态

在进一步逆向IOS时,我们发现签名只在安装标题时进行检查,而不是在执行标题时。

Image Image _非官方_的 Homebrew 频道(2008 年)
这可能是最方便用户使用的黑客程序了

因此,TT又干了。 他们精心伪造了一个可从SD卡加载任意程序的可安装频道。 如果在任天堂采取行动缓解安全问题之前安装了这个频道,那么Wii将永久享受自制程序的乐趣(独立于任天堂在未来修补其签名漏洞,而任天堂确实做到了)。

自制软件频道就是这样产生的,它允许任何用户启动自制程序,这些程序能够充分利用这个系统的全部控制权(以及这意味着的所有影响)。

任天堂的回应

出于显而易见的原因,任天堂发布了多个系统更新,修复了多个版本的IOS上的签名漏洞。

Image
很多这些问题都得到了解决。

然而,在这个系统中仍然发现了一些根本性的缺陷:

总之,剩下的就是猫捉老鼠的游戏了。 在接下来的几个月里,不同的漏洞不断被发现,任天堂随后也尝试着一个接一个地打补丁。 这样的"游戏"一直持续到游戏机达到生命周期末尾,不再发布更新为止。 我们可以认为,这次是老鼠赢了。

在撰写本文时,本文中提到的漏洞已经打上了补丁,但也被当前可用的漏洞所取代。

我想,黑客对这一系统的影响是毋庸置疑的,谁能忘记当时大量的自制游戏(甚至还有一个自制游戏"商店",比官方的"Wii商店频道 "更快、更自由)。


Previous: 9. 游戏

Next: 11. 这就是全部了,伙计们。


Rodrigo Copetti © 2026 RSS Feed

切换至现代版

主页 · 文章 · 支持 · 关于作者 · 关于此网站