2023年通过JTAG“黑客”原版Xbox:揭秘CPU级调试与秘密引导ROM提取

本文详细记录了在2023年利用英特尔Pentium III CPU的JTAG接口对原版微软Xbox进行硬件级调试的完整过程。作者通过设计自定义CPU转接PCB,绕过了微软对TRST#引脚的禁用,最终成功连接到CodeTAP硬件调试器,并提取了隐藏在NVIDIA MCPX南桥中的512字节秘密引导ROM。

工程博客

JTAG “黑客” 原版Xbox(2023版)

使用英特尔CPU JTAG接口转储微软原版Xbox的秘密引导ROM

发布日期:2023年8月9日 作者:Markus Gaasedelen

于2001年11月发布的原版Xbox是微软进军游戏主机行业的首次尝试。其硬件与21世纪初廉价但功能多样的PC非常相似,因此立即引起了技术爱好者的关注,他们希望在其上运行“自制”代码和替代操作系统。

在Xbox的生命周期内,人们通过各种硬件和软件攻击手段对其进行了破解。但20年后的今天,这款基于英特尔奔腾III的系统仍然是一个绝佳的平台,可以用来学习或探索众多至今仍具有现实意义的安全和计算机系统工程课题。

作为对我们通常内容的一次有趣偏离,本文利用了一些怀旧情怀,来解决原版Xbox研究人员早期提出的一项挑战:通过英特尔的x86 CPU JTAG接口“黑客”原版Xbox。

关于原版Xbox

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

但Xbox的安全性严重依赖于一个“秘密”的512字节引导ROM,该ROM被精心隐藏在系统的定制NVIDIA MCPX南桥中,以建立信任链。在主机发布后三个月内,Andrew “bunnie” Huang就臭名昭著地转储了这个秘密引导ROM,为后续研究敞开了大门。

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

回顾转储秘密ROM的竞赛,当时有一些讨论权衡了尝试使用英特尔的CPU JTAG功能来探测系统并读取这个难以捉摸的引导程序:

“JTAG边界扫描方法被拒绝了,理由是用于保持JTAG链处于复位状态的TRST#引脚以一种难以修改的方式被固定为有效,除非移除处理器。” ——摘自Andrew Huang 2002年的文章《Keeping Secrets in Hardware: The Microsoft Xbox (TM) Case Study》

微软故意将TRST#引脚连接到Xbox CPU下方的地线上,旨在禁用英特尔JTAG接口,阻止任何人窥探。

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

“移除处理器并使用插座被认为是成本过高且耗时;奔腾III的BGA插座成本估计在数百到数千美元。此外,奔腾III的JTAG边界扫描码在很大程度上是专有的,也必须进行逆向工程……” ——摘自Andrew Huang 2002年的文章《Keeping Secrets in Hardware: The Microsoft Xbox (TM) Case Study》

但随着Xbox自制生态系统在随后几年蓬勃发展,人们发现了一系列其他方法来廉价地破坏、转储或逃逸微软试图用秘密ROM建立的信任链。追求这些更具挑战性的硬件攻击几乎没有动力,因此它们被遗弃并很大程度上被遗忘了。

英特尔x86 JTAG

虽然如今通过新方法转储或绕过秘密ROM几乎没有什么额外收益,但能够对Xbox CPU进行硬件调试仍然可以提供无与伦比的内部洞察力,以进一步研究和保存该平台丰富的历史。JTAG调试CPU的一些好处包括:

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

然而,二十年过去了,仍然没有任何开源硬件或软件解决方案了解英特尔的私有JTAG指令……考虑到x86的普及程度,这似乎很奇怪。另一种选择,即寻找过去半完成的“高度专有”硬件调试器(及其软件组件),几乎同样具有挑战性:

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

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

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

自研CPU JTAG

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

我开始查阅旧的英特尔处理器数据手册、硬件开发人员手册、主板参考设计和那个时代的平台建议,以开始拼凑出对这些硬件调试器应如何物理连接到CPU的更好理解。

作为一名主要从事软件研究的人员,我并不想在英特尔CPU的物理集成操作上走捷径。为了消除所有硬件上的模糊性,我决定最好设计一个CPU转接PCB,以便清晰地引出JTAG信号,并根据英特尔的规格进行适配,以重建ITP端口。

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

绝大多数CPU信号只是以一对一的方式穿过这个4层CPU转接PCB。这个转接板最初设计为简单的2层PCB,但在经过同行评审后,考虑到当今业余PCB生产的成本差异可以忽略不计,升级到了4层。

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

从JLCPCB订购五块4层ENIG PCB的最小订单费用为20美元,DHL运费为20美元。在等待JTAG转接板PCB到货的同时,我从另一个项目中剩余的松散Xbox CPU中,为一两颗CPU重新植球。

下单八天后,我收到了JTAG引出CPU转接板,并准备好一块主板进行安装尝试。

安装JTAG引出CPU转接板

即使使用半专业设备,安装JTAG引出转接板也是一个繁琐的过程,容不得半点差错。以下图像系列描述了移除原始CPU并安装JTAG转接板的大致步骤。

安装过程中最关键的步骤是确保不仅一个,而是两个球栅阵列的对齐和回流焊接,在一次返修温度曲线下完成。虽然我使用了一些聚酰亚胺胶带(kapton)来帮助确保底部阵列(转接板到主板)的对齐,但顶部球阵列(CPU到转接板)是靠肉眼完成的。

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

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

转接板是在完成回流焊过程后手动组装的。我不相信30针接头能在焊接CPU和JTAG转接板所需的高温下不熔化。考虑到此次安装的复杂性,以及使用未经测试的设计来转接150个敏感的CPU信号,整个过程进行得出奇地顺利。

安装CPU转接板后,值得庆幸的是Xbox能够如预期般正常启动。但JTAG能工作吗?

转储秘密ROM

首次测试JTAG设置很困难,因为我对硬件和软件的“正常”连接序列一无所知,也没有相关文档。我是“按现状”获得CodeTAP的,并且很难找到带有ITP端口的奔腾II/III主板(通常是稀有的工程板)来测试它。

将硬件调试器插入我的JTAG转接板,并将软件(CAD-UL XDB)连接到它时,Xbox在尝试启动时会“FRAG”(闪烁红绿灯,一种通用的系统故障状态)。

调试器软件不断因“目标RESET已置位”而连接失败,同时CodeTAP硬件甚至没有显示它能感应到来自目标设备的电源(TGTPWR)。我稍微怀疑问题可能是什么,但我再次检查了我的原理图、引脚排列,并用探针探测了主板以确认CPU确实被复位了。

问题的根源在于原版Xbox上的系统管理控制器(一个PIC16 MCU)期望CPU在大约200毫秒内通过一系列系统完整性测试,否则它将复位整个设备链。我已将调试器配置为在系统连接时恢复运行,但这显然没有按预期工作。

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

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

在努力熟悉调试器并经历了几次系统复位后,我能够导航XDB内存视图到系统内存顶部的512字节(复位向量附近)——使用JTAG从一台零售版Xbox主板上完整地转储了原始的1.0版秘密引导ROM。

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

持续探索

融合怀旧的好奇心与建立对计算机硬件更深层次理解的绝佳机会,是这项研究的真正目的。此外,能够对Xbox CPU进行硬件调试,开启了一些新的、我本人感兴趣的周边项目,旨在进一步研究该平台和通用的操作系统内部原理。

虽然不充分,但微软确实积极努力地在Xbox中层层部署安全机制。通过转接板释放TRST#,用Arduino满足SMC安全挑战,并使用JTAG转储秘密ROM之后……他们还隐藏了最后一招,即在启动后几秒钟内将异常的CPU启动与MCPX的强制复位绑定起来。

找出这最后一次复位的起源、它在系统内的历史以及最终的禁用方法,可能成为另一篇独立的博客文章,强调也许Xbox内部仍然有一些值得厘清其背景的谜团。

现在英特尔JTAG在Xbox上完全正常运行,在改进这项工作时减少了不确定性,可能可以消除Arduino,甚至可能消除CPU转接板。从长远来看,这个奔腾III JTAG设置为研究英特尔私有JTAG指令(作为这项工作的衍生物,具有更广泛的应用)提供了一个良好的基础。

如果你对定制的英特尔JTAG技术感兴趣或有所了解,请考虑(尽你所能)贡献给正在GitHub上建立的这个初生的开放知识库。这是为数不多的旨在保存或记录x86 JTAG的现代资源之一,事实证明它在本文描述的工作中非常重要。

结论

这篇博客文章重新审视了一个旧想法:最初的微软Xbox本可以通过英特尔的x86 CPU JTAG接口被黑客攻击。我们创建了一个自定义的CPU转接板PCB,将JTAG信号引至CodeTAP硬件调试器。通过英特尔JTAG成功转储了Xbox的秘密引导ROM,并从执行的第一条指令开始就具备了真正的调试能力——为一个长达20年的理论画上了句号。

硬件CPU调试可以提供比传统软件和基于操作系统的内核调试技术更独特的系统内省能力。这类硬件解决方案曾经是高度专有的,关于它们的公开信息非常少,这使得这次研究经历充满挑战,但也同样有益。


GITHUB | TWITTER | BLOG | CONTACT

(C) 2025 RET2 SYSTEMS, INC.

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计