相关影像
快速入门
尽管Wii缺乏竞争对手所享有的先进图形技术,但新型控制方式和创新软件为这款游戏机带来了值得炫耀的新领域。
在这里,我们将分析这款游戏机的方方面面,从它已经为人熟悉的硬件到它被忽视的安全系统,包括它的主要缺陷。
注:有些部分与之前有关GameCube的文章部分内容重叠,因此我不会重复这些信息,而会在文章的相应部分添加一个链接。
下一代控制器
让我们先来讨论一下这款游戏机最具标志性的一个方面: 控制器。
主要设备就是Wii遥控器(也称“Wiimote”),这是一个外形类似电视遥控器的小工具,包含多种输入控制功能:
- 首先,它有一组物理按键,可以像传统控制器一样使用。
- 它还包含一个用于检测方向变化的加速度计,这是实现运动感应的主要部件。
- 最后,它还包含一个红外摄像头,结合加速计和一些Wii处理功能,可用于指向屏幕。
- 这种传感器需要感应条(随游戏机附送)。 感应条上有两组红外线LED灯,摄像头可以感应到这些LED灯,Wii利用三角测量法计算Wiimote与电视之间的位置。
遥控器由博通的BCM2042芯片驱动[1],该芯片包含成为独立蓝牙设备所需的所有电路(CPU、RAM、ROM,当然还有蓝牙模块)。 虽然Wiimote的编程遵循“蓝牙HID”协议,可被识别为输入设备,但它并不符合交换数据的标准方法(可能是为了禁止在非Wii系统上使用)。
最后,Wiimote还包括16 KB的EEPROM用于存储用户数据,以及一个仅限于低质量采样(3kHz 4位ADPCM或1.5kHz 8位PCM)的小型扬声器。
扩展配件
任天堂为该系统配备了另一个反手使用的控制器——Nunchuk,该控制器自带加速度计、摇杆和两个按钮。 它与Wiimote上的一个6针专有接口相连。
该端口还配备了其他配件,每种配件都提供不同类型的输入。
中央处理器 (CPU)
在Gekko取得成功后,IBM大概采用了这一设计,并将其重新命名为“750CL”,供其他制造商使用[3]。 后来,当任天堂要求为其新游戏机(仍称为“Revolution”,因此其主板上有RVL前缀)配备新的CPU时,IBM和任天堂同意使用主频为Gekko 1.5倍的750CL。 这种CPU被称为Broadway[4],运行频率为729 MHz。
在评测过Gekko之后,我发现新CPU恐怕没有太多变化。 不过,这也可能是一种优势:GameCube的开发人员可以利用他们在Gekko上获得的所有经验,立即开始开发新的Wii游戏。 此外,Broadway的运行速度是Gekko的1.5倍,这将使他们能够开发出更多的功能和更高的质量。
那内存呢?
这一点非常有趣,老一代GameCube的内存布局经过重新安排和改进,做出了以下改动:
- Splash(24 MB的1T-SRAM)现在位于Hollywood SoC内(稍后解释),现在称为MEM1[5]。
- 然而,ARAM(16 MB串行SDRAM)早已不复存在……
- 新的内存芯片MEM2包含64 MB GDDR3 SDRAM,用于一般用途。
- 这种内存以传统的DDR2系统为基础,但经过改进,具有更高的带宽(约为原来传输速率的2倍)和更低的功耗,非常适合GPU。
向后兼容性
目前,你可以把这台游戏机看作是GameCube的超集,因此,与上一代游戏的兼容性自然也就继承了下来。 尽管如此,为了使Wii完全向后兼容,旧的外部端口也被带到了Wii上,其中包括GameCube控制器和存储卡端口。 不过,也有新的限制: 新内存映射与旧内存映射不兼容。 因此,在软件中实现了一个薄薄的“仿真”层(更多详情请见“I/O”和“操作系统”部分)。
至于使用串行/高速插座的GameCube配件,恐怕Wii并不包括这些端口,因此这些配件无法在此使用。
遗憾的是,后来Wii的新版本也取消了这些接口。
图形
与GameCube类似(图形组件、I/O接口和音频功能被整合到一个名为Flipper的芯片中),Wii也效仿了这一做法,在Broadway旁边安装了一个名为 Hollywood的大芯片。 公平地说,这里的图形子系统与Flipper的完全相同,只是做了极少的修正。
因此,Hollywood的GPU执行的任务与当年Flipper执行的任务相同,但时钟速度提高了1.5倍(243 MHz)。 这一提升意味着在相同的单位时间内可以处理更多的几何图形和特效。
功能
由于3D引擎仍然是Flipper同款,我不想重复同样的流水线概述,而是要提及游戏必须经历的一些有趣的设计变化:
标准化宽屏幕
GameCube游戏缺乏对宽屏显示的适当支持(即从传统的4:3改为16:9帧)。 尽管如此,Flipper的GPU已经能够做到这一点,而且一些游戏还提供了激活选项,尽管这仍然被认为是一项独有的功能。
尽管如此,Flipper的帧缓冲器仍保持不变,视频编码器仍输出符合PAL或NTSC标准的帧,因此“宽屏”功能是通过扩大投影矩阵的视野来实现的。 其结果是以更大的视角渲染场景,但现在看起来水平方向被压扁了。 不过,宽屏电视也在这一过程中发挥了作用,因为它随后会拉伸(来自游戏机的)4:3画面,因此显示的图像看起来或多或少会符合正确的比例。 如果你好奇的话,这种技术并不新鲜,它一直用于电影放映,被称为变形宽银幕。 此外,SNES的开发人员不得不处理相反的效果,这也很有趣。
言归正传,Wii通过允许在系统设置中激活“宽屏模式”将这一功能标准化,这反过来又促使它被_宽泛的_采用(双关语)。
屏幕交互
你可以通过指向星星来拾取它们
全新的、颠覆性的手柄设计意味着Wii游戏中出现了新的交互方式。 由于Wiimote可以让用户指向屏幕,一些游戏(如《超级马里奥银河》或《塞尔达传说:黄昏公主》(The Legend of Zelda: Twilight Princess))利用这一功能让玩家与场景进行互动。
在题为_《神话调试:Wii是否比GameCube更难模拟?》(Myth Debugging: Is the Wii More Demanding to Emulate than the GameCube?)_的报告中[6],Dolphin模拟器的开发人员解释说,像《超级马里奥银河》和其他第一人称射击游戏都依赖嵌入式Z缓冲区来识别Wiimote指向的物体,和/或检查物体离Wiimote光标有多远。
这本身并不是一项新功能,而是对当前功能的一种新颖利用。 GameCube游戏并不依赖带有指示器功能的多功能控制器。 现在,玩家可以同时控制角色和指向屏幕。
更新的设计
Broadway和Hollywood的额外提升的频率加上前卫的设计,为角色模型带来了一些改进。 这些改进可能不如其他几代那么显著,但仍然值得注意和赞赏。
线框 | 表面 | 纹理 |
点击启用交互功能 |
4718个三角形
线框 | 表面 | 纹理 |
点击启用交互功能 |
5455个三角形
线框 | 表面 | 纹理 |
点击启用交互功能 |
1985个三角形
线框 | 表面 | 纹理 |
点击启用交互功能 |
3644个三角形
视频信号
令人惊讶的是,这款游戏机不再使用老式的多路输出端口,而是采用了一种形状略有不同的变体,称为AV多路输出(名字起得真好)。 该端口可传输之前的所有信号以及YPbPr(称为“分量端口/色差端口”)[7]。 它还包括一些数据线,系统用这些数据线来识别所插电缆的类型。
遗憾的是,这种介质继承了GameCube的相同限制。 也就是说,PAL机子上没有S-Video,NTSC机子上没有RGB。 此外,RGB只能播放隔行扫描信号(不能逐行扫描)。
音频
Wii采用了与GameCube相同的旺宏(Macronix)DSP,详细分析请参阅那篇文章。
与GameCube相比,唯一的主要变化是,由于ARAM已不复存在,MEM1或MEM2可用作音频缓冲器。
I/O
该游戏机的I/O子系统确实带来了颠覆性变化(请原谅我的双关语)。 现在,接口由一个模块控制,该模块还能确保安全。 我说的是Starlet。
隐藏的协处理器
Starlet就是一个ARM926EJ-S CPU,与游戏机的大部分内部组件相连。 它位于Hollywood内,运行频率为243 MHz(与Hollywood相同),还包含自己的ROM和RAM。 因此,您可以将Starlet视为与主CPU同时运行的独立计算机。
其内核与任天堂DS上使用的内核相似,只是增加了两个“特殊”部件:
- 型号名称中的“J”表示包含Jazelle:一个执行8位Java字节码的专用单元。 Java程序仍将依赖虚拟机(称为“JVM”),但某些操作码可直接从CPU执行。 总的来说,这可以加快已编译Java代码的执行速度。
- 专用的内存管理单元(MMU),可启用虚拟内存。 这对通用操作系统非常有用。
这些增强功能有点“奇怪”,因为它们在Wii上完全没有使用。 尽管如此,任天堂还是为Starlet选择了这一内核。 这让我想起了第一代iPhone(2G),它也包含一个带有Jazelle(也被浪费了)的ARM CPU。
如果你想知道,Jazelle从来没有走红。 经过几次迭代后,人们发现Java字节码在软件上运行得更好。 后来,ARM用“Thumb-2EE”取代了Jazelle,在撰写本文时(2021年6月),这两个单元都已被淘汰。
前面的暗色小插槽是一个SD读卡器
接下来,这个“I/O CPU”的任务是在许多I/O和Broadway之间仲裁访问权限,在此过程中,它还负责安全(决定是否允许访问)。 例如,在允许访问NAND时,这一点尤为重要,因为NAND是存储主操作系统和用户数据的地方。
该芯片还继承了ARM的一些技术,如高级微控制器总线架构(Advanced Microcontroller Bus Architecture,AMBA),这是一种通过一组专用总线促进设备间通信的协议。
尽管如此,任天堂还是利用两条AMBA总线对I/O进行了布线[8]:
- AHB总线(AMBA High-performance Bus,AMBA高性能总线): 顾名思义,它专为高速通信而设计。 在这里我们可以找到:
- NAND接口: 访问存储操作系统和用户数据的512 MB NAND闪存。
- 两个安全数字输入输出(Secure Digital Input Output,SDIO)接口:SDIO是一种主要用于访问SD卡的协议,但在本例中,第二个接口也用于控制Wi-Fi模块(802.11 b/g)。
- USB 2.0控制器:连接两个外部USB插座和一个内部蓝牙2.0子卡。
- 一个SHA-1和AES模块:专用于安全任务(更多详情,请参阅“反盗版”部分)。
- APB总线(Advanced Peripheral Bus,高级外设总线):仅限于低性能组件使用,包括:
- 驱动器接口:连接光驱。
- 串行接口:连接GameCube控制器。
- 外部接口(External Interface,EXI):我们以前见过它。 它与其他GameCube硬件通信,用于向后兼容。
保持兼容性
尽管I/O系统发生了巨大变化,但Wii仍能与GameCube游戏保持完全向后兼容。 这是因为在执行GameCube游戏时,可以对Starlet进行重新编程,以重新映射I/O,就像在原版GameCube上期望能看到的那样。
此外,实时时钟芯片还包括一些备用ROM,用于存储GameCube游戏使用的位图字体(拉丁文和日文集);以及SRAM,用于保存与IPL相关的设置。
操作系统
总的来说,Wii有两个操作系统。 一个在Broadway(主CPU)上执行,另一个在Starlet(I/O CPU)上执行。 这两个系统都位于512 MB的NAND存储中,并可以更新。
Starlet的操作系统
Starlet已经是一款有趣的硬件,但它的软件却更加引人入胜。 你看,这个操作系统不仅可以完全访问游戏机的每一个角落,而且还是按下电源键后首先运行的系统。
Starlet运行的系统被非官方地称为“I/O操作系统”或“IOS”(请不要将其与苹果公司的iOS系统混淆)[10]。 IOS是一个功能齐全的操作系统,由以下部分组成:
- 微内核:控制ARM9 CPU、执行进程并使用驱动程序与其他硬件对话。
- 驱动程序: 实现与CPU外部硬件的通信(I/O)。
- 进程: 执行任务,如网络管理或执行文件系统。
- 加密内核: 加速加密相关操作(仅限AES和SHA-1)。
考虑到这一点,IOS的主要工作是通过抽象I/O和安全系统来卸载主CPU的工作量。 因此,程序员无需担心这些问题。 为此,Starlet为自己的任务预留了12至16 MB 的GDDR3 RAM,其余部分由Broadway和GPU使用。
Broadway和Starlet使用进程间通信协议(Inter-Process Communication,“IPC”协议)相互通信: 简而言之,两个CPU共享两个寄存器。 一个CPU可以向另一个CPU的寄存器写入数据(写入的数据可以是一条命令,也可以是一个值),接收端CPU可以执行相应的功能。
IOS的更新系统有点麻烦:更新的IOS版本不会安装在旧版本上,而是安装在另一个插槽中(NAND中为IOS预留的区域被划分为多个“插槽”)。 这完全是出于兼容性的考虑,因为它允许旧版Wii软件继续使用与之相同的IOS版本。
任天堂经常发布IOS更新来改进硬件支持(这在新配件上市时是必要的)。 只有一个例外下IOS更新实际上取代了旧版本: 当发现某个特定版本存在可利用的漏洞时。 这只是出于安全考虑。
当插入GameCube游戏时,情况就不同了: Starlet启动的是MIOS。 这个IOS变体只是命令Starlet模拟原始的IPL。
Broadway的操作系统
这个菜单通常被称为系统菜单,在主PowerPC CPU(Broadway)上有效运行。
与IOS相比,我不认为这是一个“完全成熟”的操作系统,而更像是一个“程序”,允许用户执行以下操作:
- 启动Wii/GameCube游戏:只有在插入有效游戏碟的情况下。
- 更改游戏机设置:包括时间、日期、视频模式或感应条位置等。
- 运行应用程序:该游戏机的新颖之处之一是可以安装Wii小游戏(称为“WiiWare”)、复古游戏(“虚拟游戏机”游戏)或方便的应用程序(如互联网浏览器)。 任天堂称这些为“频道”,但操作系统也称它们为“标题”。
- 用户可以通过预装的Wii商店频道下载/购买频道。
- 虚拟游戏机应用嵌入了一个模拟器来运行游戏本身。 奇怪的是,模拟器并不是跨系统共享的,甚至在同一平台的游戏之间也不是共享的。 这样就可以针对特定游戏优化模拟器。
- 发送/接收信息:Wii有一个唯一的ID(刻录在其SEEPROM芯片中),可在其他Wii之间共享以交换信息。 信息可以在留言板上看到。
- 任天堂和Wii游戏也利用这一媒介提供通讯。
就像IOS一样,任天堂也对该系统发布了多个更新。 有的修复了安全漏洞,有的增加了更多功能。 一个值得注意的新功能是可以在SD卡上存储频道。
Broadway上运行的任何程序(包括系统菜单)都依赖于特定的IOS版本才能运行。 启动游戏或频道时,Starlet会使用所需的IOS声明版本重新启动。
更新媒介
任天堂将其称为系统更新。 它们在同一个软件包中包含两个操作系统,并使用序号进行版本控制。 目前已知的最后一个版本是2010年6月发布的4.3E
。
系统更新包可从任天堂服务器或游戏光盘中获取。 用户可以使用系统菜单手动检查更新。 如果游戏需要特定版本但尚未安装的IOS,(且光盘中恰好包含所需的软件包)则会强制更新。
启动顺序
到目前为止,我们已经讨论了驻留在该游戏机中并同时运行的两个截然不同的操作系统。 这看起来相当简单,不过两者必须在游戏机启动时小心协调,之后才能正常工作。
也就是说,该游戏机的启动过程如下[11]:
- 用户轻按游戏机上的开机按钮。
- Boot0阶段: Starlet运行内嵌Mask ROM(1.5 KB)中的硬连线程序。
- 简而言之,Starlet会解密并检查前96 KB NAND的完整性,然后计算哈希值,并与Starlet嵌入式OTP存储器中保存的哈希值进行比较。 如果两个哈希值不匹配,则诱导游戏机进入无限循环。
- Boot1阶段: Starlet运行上述96 KB NAND中的一个小程序。
- 该程序将指示Starlet 初始化(清除)64 MB GDDR3 RAM,然后解密并验证NAND的其余部分。
- Boot2 阶段: Starlet加载初始IOS(系统菜单需要的),然后启动Broadway。
- Broadway启动系统菜单。 现在由用户控制。
游戏
虽然新游戏并不总是在图形上有很大的飞跃,但它们所能提供的功能之多确实让用户大吃一惊。 这要归功于任天堂在推出游戏机时提供的新服务,从新的控制方式到标准化的在线基础设施(WiiConnect24),这些服务使用户可以免费进行在线游戏。
存储介质
Wii游戏使用一种名为Wii光盘的专有光盘格式发行(我知道,这个名字再明显不过了)。 总之,Matsushita/Panasonic(松下)公司在传统DVD光盘的基础上设计了这种格式,同时增加了一些非标准功能,如在光盘内部增加一个冲切区,以防止未经授权的复制。
Wii光盘提供4.7 GB(如果是单层)或8.54 GB(如果是双层)的可用空间。 它们通常包含两个分区: 第一个分区用于系统更新,另一个分区用于实际游戏。
一些游戏,如《任天堂明星大乱斗X》等游戏包含更多分区,用于存储多个虚拟游戏机游戏,这些游戏在主游戏内执行。
开发
作为传统的一部分,任天堂提供了一个开发工具包。 这个套件被称为NDEV[12],形状像一块放大的黑_砖_。 NDEV配备了增强的I/O接口和两倍的MEM2(共128 MB)用于调试。
官方软件套件被命名为Revolution SDK[13],其中包括用于开发的各种工具、编译器、调试器和框架(主要使用C/C++语言)。 任天堂通过一个名为Warioworld.com(现已下线/重定向)的门户网站发布后续更新,只有获得批准的开发人员才能访问该网站。
官方SDK依赖IOS调用与Wii硬件进行交互,这就是为什么IOS更新经常与SDK更新相关联。
返回首页
考虑到这款游戏机在软件方面的种种进步,你可能会惊讶于游戏仍然在裸机上运行,这意味着它们可以完全控制Broadway,但无法控制Starlet(因此,这里实施了安全机制)。 毋庸置疑,游戏的行为仍需得到任天堂的批准后才能发布。
话虽如此,不同游戏中的某些功能看起来还是非常相似的。 例如,你还记得著名的“主页菜单”吗? 按下Wiimote上的“HOME”键就会在游戏中弹出一个屏幕,让用户无需重启游戏机就能返回系统菜单。 既然操作系统不提供这一功能,那么为什么每款游戏都能提供相同的图形界面呢?
答案很简单,任天堂在SDK中加入了一些游戏必须嵌入的库。 瞧,其中一个库就能绘制出这样的界面。 此外,这也是你会发现只有自制软件才会采用“原创”设计的主页菜单的原因。
根据Wii编程指南文件(可在官方SDK上找到)的规定,官方主菜单是游戏必须包含的200多项要求之一。 其他要求还包括在游戏开始时显示“Wii绑带提醒”屏幕(只是一张BMP图像),以及如何与之互动。
个性化游戏
我想强调的另一项新功能是Mii的引入,用户可以通过一个名为Mii频道的专用频道创建自己的头像。
但乐趣还不止于此,因为游戏也可以获取这些新创建的Mii来个性化游戏。
反盗版&自制软件
我认为,这款游戏机提供的大量功能对黑客来说非常有吸引力,因为破解安全系统可以让自制游戏开发者无需通过任天堂的检查就能获得游戏机的功能。 尽管如此,Wii最终还是拥有了一个非常棒的自制软件库。
复制保护
让我们从常见的受害者开始:光驱。
Wii光盘包含前面提到的“冲切区”,传统光驱无法访问该区域。 因此,如果没有这个区域,驱动程序将始终拒绝读取内容。
改机芯片开发人员发现,光驱包含一个名为“串行写入器”的调试接口[14],不过在输入密钥之前,这个端口是锁定的。 不过,密钥迟早会被发现。 一旦出现这种情况,改装者就能禁用复制保护,并随后开发出一种能自动完成这一过程的改装芯片。
松下发布了该光驱的进一步修订版,对调试界面进行了混淆,然而,读取器中的其他缺陷也被发现,从而再次使其失效。
值得一提的是,由于光盘内容仍被加密,改机芯片的主要好处是可以进行简单的盗版,因此需要更多的研究和工具来运行自定义代码。
另一方面,GameCube自制游戏已经可以通过以前在前代产品上发现的漏洞来执行。
系统加密
这可能是这款游戏机最复杂的部分,然而对它的永不停歇的研究却为许多才华横溢的开发者和令人惊叹的程序打开了大门。
Wii围绕几种加密算法(AES、RSA、ECC、SHA-1和HMAC)设计内部安全。 为了便于解释,我们将分别介绍每一组密码:
共享加密
许多组件(NAND、游戏光盘和SD卡)之间的通信都经过加密,以避免被篡改。 任天堂选择了对称密钥系统来保护它[15],这意味着Wii使用相同的密钥来加密和解密数据。
Starlet的OTP存储器中存储有三个128 位AES密钥[16],这些密钥在制造过程中只写入一次:
- 通用密钥:任天堂生成的全局密钥,所有Wii上都有,用于解密通道和光盘游戏的第一层加密(从现在起我们称其为标题)。
- SD密钥:用于加密/解密传输到SD卡的数据,只有系统菜单才能执行这些传输。
- 任天堂在IOS中存储了该密钥的副本,原因不明。
- NAND密钥:这个密钥是在制造过程中随机生成的(也就是说每台Wii都是唯一的),用于保护NAND芯片。
由此我们可以看出,Starlet负责加密/解密合理的内容,这就是为什么只有这个CPU可以访问机密数据的原因。
信任链
标题包含另一层安全机制,即RSA-2048。 这是一种非对称密码,意味着我们需要一个密钥来加密内容,另一个密钥来解密内容。 一言以蔽之,任天堂可以使用未公开的密钥(称为“私钥”)对游戏进行加密,而Wii则使用存储在游戏机中的“公钥”进行解密。 如果黑客获得了公共密钥,也不足以破解安全系统,因为数据仍然要使用只有任天堂知道的私人密钥进行加密。
此外,RSA不仅用于加密内容,还用于检查加密的完整性。 任天堂使用多个密钥对已加密的数据进行签名(加密),形成一个加密链,目的只有一个,那就是确保加密的完整性:
- 使用的每个密钥都经过任天堂授权。
- 数据不会在未经授权的情况下被篡改和重新加密。
让我举例说明其工作原理:
- 任天堂创建了一个名为
x
的密钥。 - 任天堂对Starlet进行编程,使其只信任使用
x
密钥签名的内容。 - 如果Starlet发现自己需要解密一个密钥为
y
的文件,那么只有在y
被x
密钥签名后,它才会继续解密。
这就是所谓的信任链。 在Wii之外,这种技术通常用于保护我们在全球范围内的大部分通信(例如,使用HTTPS的网络浏览器依靠“根证书”来验证未知证书的真实性)。
Starlet的信任链
Starlet的OTP存储的是公钥(也就是说,就我们的目的而言,它只能解密和验证内容的签名)。 它的信任链由以下密钥组成[17]:
- 根密钥:签署CA密钥。
- Starlet只需存储这个(公开)密钥,其他内容只要经过这个密钥签名,就能被解密(并随后被信任)。
- 认证机构密钥(CA密钥):签署XS和CP密钥。
- XS密钥: 该密钥签署“门票”,这是一种包含解密标题所需的AES密钥列表(称为“标题密钥”)的数据类型。
- CP密钥: 使用相应的标题密钥解密标题后,CP密钥将用于签署标题的元数据(称为“TMD”)。
- 元数据包括一个SHA-1哈希值,Starlet用它来验证数据的完整性,但元数据本身并不对内容进行签名。
如你所见,所有这些都使任天堂成为内容的唯一发行商,这对担心盗版的游戏工作室来说是件好事。
更多密钥
该系统还包含一对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密钥说起,该算法可能很难破解,但如果以某种方式提取了密钥(尤其是通用密钥),这层安全保障就会立即失效。 因此,主要的挑战在于如何提取它们。
一群名为“Team Twiizers”的黑客发现,GameCube模式缺乏签名可能是一个很有潜力的攻击面[18]。 他们不仅发现在运行NGC程序后,3/4的GDDR3 RAM没有被清除,而且还发现通过桥接主板上的一些地址点(使用一把镊子),他们可以交换所选的GDDR3 RAM组,从而访问受限区域。 果然,AES密钥就在其中。
别忘了,这只能解密“第一层”安全机制,但要执行无签名程序(自制软件),RSA也必须被破解。 不幸的是,这在计算上是不可能的…… 除非其实现存在缺陷。 Team Twizzers并没有就此止步,他们开始逆向IOS的编码方式,重点关注其签名验证功能。
RSA签名验证的工作原理是将RSA运算的哈希值与解密后的签名进行比较。 经过一番摸索,小组发现了一个有趣的现象:任天堂使用strncmp
(C的“字符串”比较函数)实现了这一功能。
对不熟悉C语言的人提一下,strncmp
是一个用于检查两个字符串是否相等的例程。 该方法接收三个参数:两个字符串和一个整数,后者表示要比较的字符数。 然后,strncmp
开始比较每个字符,直到字符串的末尾(或字符计数器指定的位置)。 在C语言中,字符串只是一个以\0
字符结束的字符链,这意味着一旦任何字符串达到\0
,strncmp
就会停止比较。 因此,如果Wii标题的哈希值在开头包含\0
,Starlet 的RSA计算就会发现自己在比较非常短的哈希值(甚至是空哈希值)时,很有可能发生碰撞(不同的数据产生相同的哈希值)。 最终,通过一定程度的暴力破解,比较的结果是相等
的……鉴定为标题已签名!
如果这还不够,这个漏洞还在多个IOS版本中被发现,甚至在boot1和boot2的例程中也被发现!
自制软件的曙光
在这之后,就只剩下一件事了: 将漏洞永久化,并开发一款“用户友好型”工具,让它能轻松运行自定义程序。
到目前为止,这些漏洞需要使用额外的硬件,因此并非每个用户都能使用…… 直到Team Twizzers发现了另一个漏洞: 一个游戏缓冲区溢出。
我指的是著名的《塞尔达传说:黄昏公主》(任天堂出品的一款游戏)。 TT发现,该游戏的保存文件可以被修改,以溢出用于命名玩家马匹的字符数。 因此,当玩家试图读取溢出的名称时,就会触发连锁反应,最终导致任意代码执行。 比方说,这可以用来运行程序加载器。
由于签名现在可以伪造,这种伪造的保存文件很容易在网络上传播,供其他人使用。 因此,自制软件社区现在可以执行他们的定制软件了。
永久状态
在进一步逆向IOS时,我们发现签名只在安装标题时进行检查,而不是在执行标题时。
这可能是最方便用户使用的黑客程序了
因此,TT又干了。 他们精心伪造了一个可从SD卡加载任意程序的可安装频道。 如果在任天堂采取行动缓解安全问题之前安装了这个频道,那么Wii将永久享受自制程序的乐趣(独立于任天堂在未来修补其签名漏洞,而任天堂确实做到了)。
自制软件频道就是这样产生的,它允许任何用户启动自制程序,这些程序能够充分利用这个系统的全部控制权(以及这意味着的所有影响)。
任天堂的回应
出于显而易见的原因,任天堂发布了多个系统更新,修复了多个版本的IOS上的签名漏洞。
然而,在这个系统中仍然发现了一些根本性的缺陷:
- Broadway可以在没有额外权限的情况下将Starlet重启到任何IOS版本,从而利用未打补丁的版本。
- 隐藏的IOS API仍然可以在没有特殊权限的情况下使用,从而允许对硬件进行更多未经授权的控制。
- 光盘驱动器可以接收读取传统DVD的命令,而某些IOS包含发送这些命令的隐藏调用。 由于盗版原因,这一点尤其令人担忧。
总之,剩下的就是猫捉老鼠的游戏了。 在接下来的几个月里,不同的漏洞不断被发现,任天堂随后也尝试着一个接一个地打补丁。 这样的“游戏”一直持续到游戏机达到生命周期末尾,不再发布更新为止。 我们可以认为,这次是老鼠赢了。
在撰写本文时,本文中提到的漏洞已经打上了补丁,但也被当前可用的漏洞所取代。
我想,黑客对这一系统的影响是毋庸置疑的,谁能忘记当时大量的自制游戏(甚至还有一个自制游戏“商店”,比官方的“Wii商店频道 ”更快、更自由)。
这就是全部了,伙计们。
2020年新年快乐!
这篇文章花了我不少时间,我天真地以为,既然GameCube上的大部分内容都已经完成,我只需要写一些小段落,并在这里和那里添加链接……
我觉得结果比我预想的更有信息量,所以希望你能读得愉快。
下篇文章见!
Rodrigo