[控场AI]
· 5 分钟阅读· 2,939 字

Claude Code逆向Xbox 360内核,编写原生驱动让次世代手柄兼容

Claude Code逆向Xbox 360内核,编写原生驱动让次世代手柄兼容

开发者借Claude Code逆向Xbox 360内核,写出原生驱动让Series X|S手柄无线运行。

一位开发者利用Claude Code逆向工程了Xbox 360内核的USB栈和XAM输入路径,并移植xone的无线协议代码,编写出原生驱动,使最多四个Xbox Series X|S手柄能通过微软无线适配器在Xbox 360上无线工作,支持振动和Guide按钮,在仪表盘和游戏中均正常。开发中解决了寄存器宽度不匹配、浮点上下文缺失、Guide按钮死锁等多个内核级bug,并通过构建检查防止回归。项目以GPL-3.0开源,展示了AI编程工具在系统级逆向工程中的人机协作潜力。

在游戏主机改装圈,让Xbox Series X|S手柄原生运行在Xbox 360上曾被视为一项艰巨挑战。微软自家的Xbox无线适配器(Series X|S手柄的USB接收器)从未支持过Xbox 360,因为其核心是一颗MediaTek Wi-Fi芯片,依赖主机完成固件上传、射频设置、配对、ECDH安全握手以及微软的GIP控制器协议。PC上有微软驱动,Linux有xone,而Xbox 360则一片空白。

一位开发者(Reddit用户Jacckii)在r/360hacks社区分享了他的成果:借助Claude Code,他逆向工程了Xbox 360内核的USB栈和XAM输入路径,并编写了一个原生驱动,让最多四个Series X|S手柄通过无线方式在Xbox 360上作为普通手柄工作,支持振动和Guide按钮,在仪表盘和游戏中均正常。该项目以GPL-3.0开源,代码已发布在GitHub。

reddit source: Claude Code reverse-engineered the Xbox 360 kernel and wrote a native driver so Series X|S controlle

技术挑战:从零构建无线手柄支持

Xbox 360(内核版本17559)缺少对Series X|S手柄的任何支持。开发者需要实现完整的无线通信栈,包括MT76射频驱动、配对、ECDH P-256握手和GIP协议。这些在PC和Linux上已有现成方案(如xone),但Xbox 360的内核环境完全不同:它是一个PowerPC架构、资源受限且文档匮乏的闭源系统。

Claude Code首先通过Ghidra MCP服务器在反汇编层面分析了360内核中未文档化的USB栈(Usbd)和XAM输入路径,识别出运行时USB类驱动列表、传输块布局、回调在哪个DPC上执行,以及XAM用于Guide按钮的回调表。随后,它将xone中的MT76射频代码、配对、ECDH握手和GIP协议移植为可移植C代码,并编写了内核模式系统DLL作为360侧的实现。最后,它编写PowerPC函数钩子,通过蹦床(trampoline)重定位指令,将手柄输入接入XInput。

整个过程在实机上进行调试,通过调试监视器读取内存,逐步验证功能。

ECDH P-256握手:ECDH(椭圆曲线Diffie-Hellman)是一种密钥协商协议,允许双方在不安全的信道上生成共享密钥。P-256指使用的椭圆曲线(secp256r1),提供约128位安全强度。在Xbox无线手柄场景中,手柄与主机通过ECDH握手建立加密链路,确保配对与输入数据不被窃听或篡改。由于Xbox 360从未支持该协议,开发者需在驱动中完整实现曲线运算与握手状态机,这是移植xone代码时的核心难点之一。

GIP协议:GIP(Game Input Protocol)是微软用于Xbox One及之后手柄与主机通信的私有协议,封装了输入报告、振动指令、Guide按钮事件等。它运行在USB或无线链路之上,具有特定的报文格式与状态机。Xbox 360使用的是更早的XInput协议,因此驱动需要将GIP报文翻译为XInput兼容的输入报告,并处理两者在按钮映射、振动强度范围上的差异。

XAM与XInput:XAM(Xbox Application Manager)是Xbox 360系统软件中负责用户界面、输入路由和系统通知的核心组件,Guide按钮的全局响应即由XAM处理。XInput则是游戏使用的轻量输入API,提供标准化手柄状态。驱动需要同时对接两者:将手柄数据注入XInput供游戏读取,并模拟XAM期望的输入事件以触发Guide菜单。理解XAM的回调表结构是逆向工程的关键突破点。

PowerPC函数钩子与蹦床:Xbox 360内核运行在PowerPC架构上。函数钩子(hook)通过修改目标函数入口的指令,跳转到自定义代码。蹦床(trampoline)是一小段中间代码,负责保存原始指令、重定位相对跳转,再跳回原函数,从而在不破坏原逻辑的前提下插入新功能。驱动利用蹦床将手柄输入流接入XInput调用链,这是内核级修改的经典手法。

调试难题:内核环境下的隐形陷阱

在开发过程中,Claude Code追踪并修复了多个深层次bug,这些bug反映了Xbox 360内核的特殊性:

  • 寄存器宽度不匹配:工具链将寄存器保存为32位值,而内核期望64位,导致在每个内核回调周围需要添加汇编thunk。
  • 浮点上下文缺失:内核DPC没有浮点上下文,但可变参数函数仍会溢出浮点寄存器,解决方案是使用软浮点并添加构建检查,任何浮点指令都会导致构建失败。
  • Guide按钮死锁:按下Guide按钮会导致控制台死锁,原因是向XAM提供输入的线程同时也调用了XAM。解决方法是将每个XAM调用移到另一个硬件线程上的独立线程。
  • 驱动线程饥饿:Guide打开时驱动线程饥饿,发现内核将系统线程优先级限制在9,于是将驱动优先级提升至该值。
  • 启动前插入的适配器被忽略:内核维护一个未认领USB设备列表,并有一个例程将它们重新提供给驱动,利用该机制解决了问题。

这些修复不仅让驱动稳定运行,也揭示了Xbox 360内核在USB和输入处理上的 undocumented 行为。

人机协作的工作流

开发者强调,Claude Code并非全自动,而是与人类紧密协作。他总结了几个关键实践:

  • 为目标提供“眼睛”:驱动将状态块和日志环写入内存,Claude Code在每次测试后通过网络读取它们。
  • 提供合适的工具:Ghidra MCP用于内核分析、交叉编译器、控制台调试端口。Claude Code自主运行“构建→上传→读取日志”的循环。
  • 让错误在构建时失败:每条艰难学到的规则都成为构建脚本中的检查,确保已修复的bug不会复发。
  • 人类作为执行者:开发者负责插拔适配器、配对控制器、在控制台挂起时重启,以及描述屏幕上的情况。

这种分工让Claude Code能够专注于逆向工程和代码生成,而人类处理物理操作和视觉反馈,形成高效的迭代闭环。

开源与社区反馈

项目在r/360hacks发布后几小时内,已有用户订购适配器准备测试。开发者表示项目仍处于早期阶段,欢迎反馈。开源地址为GitHub:Jacckii/Xbox360-Series-Controllers-Native。

这一案例展示了AI编程工具在逆向工程和系统级开发中的潜力:Claude Code不仅生成代码,还通过工具链集成和自动化测试循环,解决了传统上需要大量专家经验的底层难题。对于主机改装社区而言,这意味着更多老主机可以焕发新生;对于AI辅助开发领域,则提供了一个人机协作攻克复杂系统任务的范本。

#Claude Code#Xbox 360#Xbox Series X|S#逆向工程#内核驱动#AI编程#开源工具
分享:

相关推荐