[博客翻译]JTAG在2023年“黑客攻击”原始Xbox


原文地址:https://blog.ret2.io/2023/08/09/jtag-hacking-the-original-xbox-2023/


JTAG“破解”2023年的初代Xbox

使用英特尔CPU的JTAG功能提取微软初代Xbox的秘密启动ROM

2023年8月9日 / Markus Gaasedelen

2001年11月发布的初代Xbox是微软进军游戏主机行业的第一步。它的硬件与2000年代初期的廉价但多功能PC非常相似,因此立即吸引了技术爱好者们的目光,他们希望在这台设备上运行“自制”代码和替代操作系统。

在Xbox的生命周期中,它通过广泛的硬件和软件攻击被单方面破解。然而,20年过去了,这款基于英特尔奔腾III的系统仍然是一个绝佳的平台,用于学习或探索许多至今仍然相关的安全和计算机系统工程主题。

作为对我们常规内容的有趣偏离,这篇文章利用了一些怀旧情绪,来应对初代Xbox研究人员早期提出的挑战:通过英特尔的x86 CPU JTAG“破解”初代Xbox。


使用定制的JTAG CPU转接板对初代Xbox CPU(奔腾III)进行硬件调试

关于初代Xbox

与其他2000年代初期的游戏主机不同,初代Xbox是一个非常直接的硬件平台,围绕英特尔CPU和NVIDIA GPU构建,采用统一内存架构。微软设计了一个易于现有PC游戏开发者过渡的系统,利用他们在PC市场的主导地位。


初代Xbox 1.0主板:一块ATX主板,搭载32位733 MHz英特尔奔腾III CPU和定制的NVIDIA GPU

然而,Xbox的安全性严重依赖于一个“秘密”的512字节启动ROM,这个ROM被小心翼翼地隐藏在系统的定制NVIDIA MCPX南桥中,以建立信任链。在发布后的三个月内,这个秘密启动ROM被Andrew “bunnie” Huang提取出来,使得该主机向进一步研究敞开了大门。

Bunnie使用FPGA在HyperTransport总线上嗅探ROM,当ROM从MCPX传输到北桥/GPU时,再通过前端总线传输到CPU。这个攻击(以及其他攻击)在bunnie 2003年的书《“Hacking The Xbox”》(现已免费)中有详细描述。


MCPX是“媒体通信处理器”(南桥),同时也承载着秘密ROM

回顾提取秘密ROM的竞赛,当时有一些讨论关于是否尝试使用英特尔的CPU JTAG功能来探测系统并读取这个难以捉摸的启动加载程序:

“JTAG边界扫描方法被拒绝,原因是TRST#引脚(用于保持JTAG链复位)被激活,难以修改而不移除处理器。”
——摘自《Keeping Secrets in Hardware: The Microsoft Xbox (TM) Case Study》,Andrew Huang,2002年

微软故意将TRST#引脚接地,位于Xbox CPU下方,以禁用英特尔JTAG接口,阻止任何人进行探测。


初代Xbox CPU:32位733 MHz英特尔奔腾III,128 KB L2缓存,采用移动BGA2芯片封装

更重要的是,黑箱逆向英特尔的私有JTAG指令以查询内存、寄存器或执行其他类似调试器的操作被认为是非常困难的:

“移除和插座化处理器被认为是非常昂贵和耗时的;奔腾III的BGA插座成本估计在数百到数千美元之间。此外,奔腾III的JTAG边界扫描代码大多是专有的,也需要进行逆向工程……”
——摘自《Keeping Secrets in Hardware: The Microsoft Xbox (TM) Case Study》,Andrew Huang,2002年

但随着Xbox自制生态系统在接下来的几年中蓬勃发展,发现了一系列其他方法可以廉价地破坏、提取或绕过微软试图通过秘密ROM建立的信任链。因此,很少有人去追求这些更具挑战性的硬件攻击,它们被遗忘了。

英特尔x86 JTAG

尽管今天通过新方法提取或绕过秘密ROM已经没有什么意义,但硬件调试Xbox CPU的能力仍然提供了无与伦比的洞察力,以进一步研究和保存该平台的丰富历史。JTAG调试CPU的一些好处包括:

  • 从执行的第一条指令(即复位向量)开始调试系统
  • 无需修改操作系统或硬件上运行的任何软件即可进行非侵入式调试
  • 调试零售BIOS映像和其他没有本地内核调试功能的运行时
  • 如果它在CPU上运行,你就可以调试它——Xbox内核、Linux、自定义RTOS、Windows等
  • JTAG在保真度上超越了模拟器,用于研究硬件特定行为和未模拟的外设

然而,20年后,仍然没有开源硬件或软件解决方案能够访问英特尔的私有JTAG指令……考虑到x86的普及程度,这似乎有些奇怪。另一种选择是找到过去的一些半完整的“高度专有”硬件调试器(及其软件组件),这几乎同样具有挑战性:


一个Applied Microsystems的CodeTAP调试器,用于英特尔奔腾II / III,购买时“按现状”

根据我的研究,2000年代初最好的奔腾III调试器(可能也是唯一的)是由American AriumApplied Microsystems制造的。这些调试器的价格从低至$9k到超过$40k美元不等。据称,英特尔在开发这些解决方案时与这些公司签订了10-15年的保密协议。

这些调试器的主要客户是进行硬件验证或BIOS/固件开发的OEM厂商,以稳定新主板。由于市场狭窄,这两家公司生产的硬件调试器数量不超过几千台。

在2023年,这些老式硬件调试器很少出现,并且购买价格通常不超过25-75美元。

自制CPU JTAG

在Xbox上处理JTAG的一个更具挑战性的方面是TRST#引脚在CPU下方被接地。虽然理论上钻出连接以释放TRST#可能允许我们驱动JTAG状态机,但我不知道CodeTAP /硬件调试器在TRST#未按预期操作时会有何反应。

我开始查阅旧的英特尔处理器数据表、硬件开发者手册、主板参考设计和当时的平台建议,以拼凑出这些硬件调试器如何与CPU物理接口的更好理解。


英特尔参考ITP原理图,来自《Intel Pentium III Processor/840 Development Kit Manual》,2001年4月

作为一个主要从事软件研究的人,我并不想在英特尔CPU的物理集成上偷工减料。为了消除所有硬件歧义,我决定最好设计一个CPU转接PCB,以干净地引出JTAG信号,根据英特尔的规格重建ITP端口。

专用的CPU转接板将允许我隔离JTAG信号(和其他CPU控制信号),同时跳过对Xbox主板可能对这些信号进行的任何逆向工程。这也使我能够将相关信号整齐地收集到一个物理端口中,调试器通常期望通过这个端口进行连接。


KiCad 7.0中设计4层CPU JTAG引出转接板

大多数CPU信号只是通过4层CPU转接PCB 1对1地传递。这个转接板最初设计为2层PCB,但在一些同行评审后升级为4层,因为今天的业余PCB生产成本差异可以忽略不计。

感兴趣的JTAG / CPU控制信号通过内部布线层(绿色)引出,第二个内部层(隐藏在上方)仅作为地平面。引出是一个30针SMT System 50连接器,符合英特尔规格——仅这个接头就花费了15美元。


KiCad中的JTAG引出转接PCB渲染图,物理订单前


五个JTAG引出转接板,刚从JLCPCB到货

从JLCPCB订购五个4层ENIG PCB的最低成本为20美元,DHL运费为20美元。在等待JTAG转接PCB到货的同时,我重新焊接了一两个从另一个项目中剩下的Xbox CPU。

订单发出八天后,我拿到了JTAG引出CPU转接板,并准备进行安装尝试。

安装JTAG引出CPU转接板

即使使用半专业设备,安装JTAG引出转接板也是一个繁琐的过程,任何错误都会导致失败。以下图片系列展示了移除原始CPU并安装JTAG转接板的大致步骤。


原始Xbox CPU周围涂有助焊剂,以帮助回流,位于BGA返修站下,芯片移除前


从主板上移除原始Xbox CPU后的BGA焊盘,并进行焊盘清理


JTAG引出转接板的底部,坐在3D打印的夹具中,以帮助回流对齐(0.76mm球,含铅)


JTAG转接板的试装及其预期对齐,最终安装前


CPU和转接板在廉价的BGA返修站上,两者即将在单一回流曲线中焊接

安装中最关键的部分是确保不仅一个,而是两个球栅阵列的对齐和回流。虽然我使用了一些kapton胶带来帮助确保底部阵列(转接板到主板)的对齐,但顶部球阵列(CPU到转接板)是通过肉眼完成的。


BGA相机下的CPU + 转接板堆叠,BGA曲线完成回流后

在回流前,转接板的接头部分下方放置了一些“支撑”(无功能的SMD电阻)。虽然这些支撑不可见且没有任何电气用途,但它们提供了一些机械强度,有助于防止在插入或拔出JTAG带状电缆时BGA球的应力或开裂。

作为一个原型,我甚至不确定这个JTAG转接板(或安装)是否没有错误,因此我对这个概念验证尝试的理想构造或寿命并不太关心。


成功安装的JTAG转接板——此时系统能够正常启动


完全组装好的JTAG转接板,准备与CodeTAP硬件调试器进行测试

转接板在完成回流过程后手动组装。我不信任30针接头在焊接CPU和JTAG转接板所需的高温下不会熔化。考虑到这个安装的复杂性和使用未经验证的设计来转接150个敏感的CPU信号,整个过程进行得非常顺利。

安装CPU转接板后,幸运的是Xbox能够正常启动。但JTAG能工作吗?

提取秘密ROM

第一次测试JTAG设置非常困难,因为我对硬件和软件的“正常”连接序列一无所知,也没有任何文档。我以“按现状”购买了CodeTAP,并努力寻找一个带有ITP端口的奔腾II / III主板(通常是罕见的工程板)来进行测试。

将硬件调试器插入我的JTAG转接板并连接软件(CAD-UL XDB)后,Xbox在尝试启动时会“FRAG”(闪烁红色和绿色,表示一般系统故障状态)。


安装后准备主板时,将CodeTAP JTAG调试器插入转接板

调试器软件不断失败,提示“目标复位已断言”,而CodeTAP硬件甚至没有指示它能够感知目标的电源(TGTPWR)。我有点怀疑问题的根源,但再三检查了我的原理图、引脚排列,并探测了主板以验证CPU确实被复位了。

问题的根源在于初代Xbox上的系统管理控制器(一个PIC16 MCU)期望CPU在启动后约200毫秒内通过一系列系统完整性测试,否则它将重置整个设备链。我配置了调试器在系统连接时恢复,但显然这没有奏效,或者没有按我预期的方式工作。


使用逻辑分析仪探测SMC信号,同时在I2C上注入消息

我为Arduino Uno编写了一个小脚本,并将其放置在SMC和MCPX之间通常运行的I2C总线上。这样,我可以在没有正常CPU执行的情况下满足SMC的系统完整性挑战。

突然之间,一切都到位了,JTAG调试器成功连接——我瞥见了Xbox原始1.0秘密ROM的CPU复位向量,尽显其荣耀:


CAD-UL XDB(JTAG调试软件)初始连接,位于Xbox的CPU复位向量


导航到内存的前512字节,通过JTAG提取臭名昭著的MCPX秘密ROM 1.0

在努力熟悉调试器并经历了几次系统复位后,我能够导航XDB内存视图到系统内存的前512字节(围绕复位向量)——通过JTAG从零售Xbox主板上提取完整的原始1.0秘密启动ROM。

终于,针对该系统的最古老的理论攻击之一——尘埃落定。

继续探索

将怀旧的好奇心与建立对计算机硬件更深层次理解的乐趣机会结合起来,是这项研究的真正目的。此外,硬件调试Xbox CPU的能力为几个新的相关项目打开了大门,这些项目我个人非常感兴趣,以进一步研究该平台和通用操作系统内部。


JTAG破解初代Xbox的纯粹混乱,20年后的成果

尽管不够充分,微软在Xbox中积极努力地分层安全机制。通过转接板释放TRST#,用Arduino满足SMC安全挑战,并通过JTAG提取秘密ROM……他们隐藏了最后一个技巧,将异常的CPU启动与启动后几秒钟的MCPX强制复位绑定在一起。

识别这个最终复位的起源、它在系统中的历史以及最终的禁用可能是另一篇单独的博客文章,强调Xbox中可能仍然有一些值得背景化的谜团。


系统完全运行时,使用JTAG调试器中断的截图

现在,Xbox上的英特尔JTAG已经完全正常运行,通过消除Arduino甚至可能消除CPU转接板来完善这项工作变得更加确定。从长远来看,这个奔腾III JTAG设置为研究私有英特尔JTAG指令提供了一个良好的基础,作为这项工作的衍生应用。

如果你对定制的英特尔JTAG技术感兴趣或熟悉,请考虑贡献(你所能)到正在这里建立的初步开放知识库。这是为数不多的旨在保存或记录x86 JTAG的现代资源之一,在这篇文章描述的工作中证明了其重要性。

结论

这篇博客文章回顾了一个旧的想法,即初代微软Xbox可以通过英特尔的x86 CPU JTAG接口被破解。创建了一个定制的CPU转接PCB,将JTAG信号引出到CodeTAP硬件调试器。通过英特尔JTAG成功提取了Xbox的秘密启动ROM,并从执行的第一条指令开始提供真正的调试能力——为一个20年前的理论画上了句号。

硬件CPU调试可以提供比传统软件和基于操作系统的内核调试技术更独特的系统洞察力。这些类型的硬件解决方案过去是高度专有的,公开信息很少,这使得这项研究既具有挑战性又同样有回报。

GITHUB | TWITTER | BLOG | CONTACT
(C) 2025 RET2 SYSTEMS, INC.

阅读全文(20积分)