Hotdry.

Article

从热风枪到固件提取:ME2游戏手柄的USB协议逆向实战

通过热风枪拆除环氧树脂封装、识别未知指令集、提取闪存固件,最终逆向定制USB协议的全流程工程实践。

2026-04-19systems

当一款 2008 年发行的游戏周边设备失去了官方软件支持,其 USB 通信协议便成了一个无人能解的黑色谜题。ME2 手持设备正是这样一个案例:它曾通过 USB 与电脑同步游戏点数和宝石,但配套的桌面客户端早已从互联网上彻底消失。开发者 coremaze 在 2024 年决定向这个失效的接口发起挑战,最终借助热风枪、刀片和一系列逆向工程技术,成功重建了与设备通信的能力。这一过程不仅展示了硬件逆向的完整方法论,也为那些面临类似「软件已死、设备仍存」困境的开发者提供了可复用的工程模板。

硬件拆解与芯片识别困境

ME2 设备本身是一个结构极为简单的玩偶,仅配备少量按钮和一个 Mini-USB 母口。设备插入电脑后会被识别为可移动存储设备,但其中的内容仅包含一个指向在线下载游戏的链接,实际的游戏同步功能完全无法访问。由于缺乏配套软件,传统的软件逆向方法在此完全失效,唯一可行的路径是打开硬件寻找答案。

拆解后的电路板暴露了一个关键组件:SST39VF3201 型 Flash 芯片,容量为 4 兆字节,采用 16 位字长寻址。然而,核心的微控制器却被包裹在厚重的环氧树脂封装之下,形成典型的芯片 - on-board(CoB)结构。这种封装方式虽然降低了生产成本,却也将芯片型号和标识信息完全隐藏。更棘手的是,许多用于此类设备的微控制器内部包含 ROM 固化的 USB 代码,这些代码恰恰是逆向工程最需要获取的目标。没有芯片标识,就无法查阅数据手册确定指令集,整个逆向过程似乎陷入了死胡同。

面对这一困境,开发者首先尝试用热风枪加热后取下 Flash 芯片,通过市售的 X_Gecu 编程器直接读取固件内容。虽然成功提取了固件镜像并在其中找到了位图图像,但这并未解决核心问题:微控制器内部的指令集仍然未知。

热风枪与刀片:暴力拆解的艺术

传统的软件逆向思路走不通,开发者决定采取更为激进的硬件手段。他们购置了一个可调节至 500 摄氏度的热风工作站,配合刀片对 CoB 封装进行物理拆解。这一操作的灵感来自一个看似荒诞的推理:当手中拥有热风枪和刀片时,任何问题都可以被视作一颗需要撬开的钉子。

在最高温度设定下,环氧树脂封装被成功熔化并移除。然而,芯片底部依然没有任何标识文字。开发者并未止步,而是进一步使用刀片和热风对裸露的硅 die 进行物理 decapsulation(脱封),成功将整个微控制器从电路板上分离。这一操作产生了出乎意料的结果:原本被隐藏在封装下的芯片 die 得以完整暴露,虽然仍无法直接读取标识,但硅片的物理布局为后续识别提供了关键线索。

借助一把价值仅数百元的数字显微镜(用户手册虚假宣传为电子显微镜),开发者拍摄到了 die 的低分辨率照片。尽管成像质量不足以辨认 die 上的文字信息,但芯片的整体布局轮廓清晰可辨。通过数小时的比对排查,开发者最终在 Siliconpr0n(现更名为 Siliconprawn)的 die 图库中找到了匹配项:芯片型号为 GeneralPlus GPL162002A(或 B),采用 μ'nSP 指令集。这是一种在 2000 年代中期玩具中较为常见但极为小众的微控制器架构,甚至不在主流逆向工具 Ghidra 的默认支持列表中。

固件逆向与 USB 协议重建

获取芯片型号后,开发者得以查阅数据手册并找到社区开发的第三方 Ghidra 处理器模块。固件逆向工作随即展开,USB 通信相关的代码浮出水面。分析表明,ME2 设备通过 USB 大容量存储类(USB Mass Storage)实现枚举,但在标准 SCSI 命令之上实现了一套厂商自定义的扩展协议。这些扩展命令使用保留的命令 ID 0xFF 作为前缀,后续跟随意图执行的子命令代码。

通过静态分析,开发者成功识别了三个关键的固件功能:Flash 读取、Flash 编程和 Flash 擦除。每条命令都拥有特定的数据结构,包含目标地址、操作参数和负载内容。利用 libusb(实际使用其 Rust 版 rusb),开发者构建了与设备通信的用户态程序,能够发送自定义 USB 消息触发这些隐藏命令。

一个关键的发现使得整个逆向工作取得了突破性进展:Flash 读取命令未实施边界检查。通过精心构造一个读取超高位地址的请求,地址会环绕整个微控制器的寻址空间,最终回到起始位置,形成一种意外的任意内存读取能力。这意味着无需编写任何设备端代码,即可直接读取微控制器内部的全部存储空间,包括原本无法访问的片上 ROM(数据手册称之为「Embadded ROM」)。

利用这一漏洞,开发者不仅提取了完整的内部 ROM 内容,还发现了另一个更令人惊讶的 bug:Flash 编程命令在某些边界条件下会产生写超限(out-of-bounds)错误。具体而言,当编程请求的目标地址超出实际 Flash 容量时,处理器的命令序列与 Flash 芯片的命令周期失去同步,导致 0xAA 被错误地写入地址 0xAAAA。虽然这一漏洞在当前场景下并无实际利用价值,但它揭示了设备固件中潜在的安全隐患。

工程实践参数与可操作性清单

ME2 逆向案例为硬件协议逆向提供了可复用的工程参数。首先,在芯片选型未知的情况下,die 图比对是识别 CoB 封装芯片的有效途径,Siliconprawn 等社区图库收录了大量常见芯片的高分辨率 die 照片。其次,对于 Flash 芯片的固件提取,热风枪拆焊配合编程器是标准流程,建议使用带温度可控的返修工作站,典型工作温度在 350 至 450 摄氏度之间。第三,μ'nSP 指令集虽然小众,但社区已存在 Ghidra 处理器扩展,GitHub 上由 SamuelWAnderson45 维护的项目可作为起点。第四,USB 协议逆向的通用思路是优先寻找标准类实现(如大容量存储),然后在保留命令 ID 空间寻找厂商扩展,这种模式在嵌入式设备中极为常见。

最终,开发者实现了完整的命令行工具链,支持读取和修改 Flash 内容、读取和设置游戏点数与宝石、以及通过漏洞转储内存和轮询按钮状态。所有代码和研究成果已在 GitHub 仓库 ME2-Restoration 中开源。

这一案例的核心启示在于:即便官方软件已完全消失,通过硬件层面的固件提取和协议逆向,仍可重建与 legacy 设备的通信能力。当软件层面的逆向工程无路可走时,打开硬件黑箱往往能开辟新的突破口。

资料来源:GitHub 仓库 coremaze/ME2-Writeup

systems