Claude Code가 Xbox 360 커널을 리버스 엔지니어링하고 네이티브 드라이버를 작성하여 Series X|S 컨트롤러 사용 가능하게 함
요약
본 기사는 Claude Code를 활용하여 Xbox 360 커널을 리버스 엔지니어링하고 네이티브 드라이버를 작성한 과정을 다룹니다. 이 과정에서 문서화되지 않은 USB 스택과 입력 경로를 분석했으며, 이를 통해 최신 Series X|S 컨트롤러가 콘솔에 무선으로 연결되도록 하는 오픈 소스 코드를 구현했습니다.
핵심 포인트
- Claude Code를 이용해 360 커널의 미문서화 USB 스택을 리버스 엔지니어링함.
- xone, ECDH P-256 등 최신 프로토콜을 C 코드로 포팅하고 커널 모드 DLL로 작성함.
- 레지스터 크기 불일치(32비트 vs 64비트)와 FP 레지스터 누설 같은 저수준 버그를 발견함.
- 컨트롤러 연결을 위해 함수 후킹 및 시스템 스레드 우선순위 승격 등의 고급 기법이 필요했음.
Microsoft의 Xbox Wireless Adapter(Series X|S 컨트롤러용 USB 동글)는 Xbox 360에서 작동한 적이 없습니다. 이 장치는 MediaTek Wi-Fi 칩이며, 펌웨어 업로드, 라디오 설정, 페어링, ECDH 보안 핸드셰이크 및 Microsoft의 GIP 컨트롤러 프로토콜 등 모든 것을 호스트에 의존합니다. PC에서는 Microsoft 드라이버를 사용하고, Linux에서는 xone을 사용합니다. 하지만 Xbox 360에는 관련 기능이 전혀 없었습니다. 저는 이를 모딩된 360(커널 17559)에서 작동시키고 싶었고, Claude Code를 사용하여 구현했습니다. 이 코드는 무료이며 오픈 소스입니다 (GPL-3.0): https://github.com/Jacckii/Xbox360-Series-Controllers-Native
작동 방식:
최대 4개의 Series X|S 컨트롤러가 정상적인 컨트롤러처럼 360에 무선으로 연결되며, 진동 기능과 작동하는 가이드 버튼이 대시보드와 게임 내에서 모두 지원됩니다. 부팅 시 로드되며, 중간 과정 없이 Microsoft 자체 어댑터처럼 작동합니다.
Claude가 수행한 작업:
- MCP 서버를 통해 360 커널의 문서화되지 않은 USB 스택(Usbd)과 XAM의 입력 경로를 Ghidra로 리버스 엔지니어링했습니다. 여기에는 런타임 USB 클래스 드라이버 목록, 전송 블록 레이아웃, 어떤 DPC에서 어떤 콜백이 실행되는지, 그리고 가이드 버튼에 사용되는 콜백 테이블 등이 포함됩니다.
- xone의 MT76 라디오 코드, 페어링, ECDH P-256 핸드셰이크 및 GIP 프로토콜을 이식 가능한 C 코드로 포팅하고, 360 측은 커널 모드 시스템 DLL로 작성했습니다.
- 컨트롤러를 XInput으로 공급하기 위해 PowerPC 함수 후크(함수 실행 위치를 트램폴린으로 재배치)를 작성했습니다.
- 디버그 모니터를 통해 메모리를 읽으며 라이브 콘솔에서 디버깅했습니다.
발견한 버그:
- 툴체인은 레지스터를 32비트 값으로 저장하는 반면, 커널은 64비트 값을 기대합니다 → 모든 커널 콜백 주변에 asm thunks가 필요했습니다.
- 커널 DPC는 부동 소수점 컨텍스트(floating-point context)가 없지만, 가변 인자 함수(variadic functions)는 여전히 FP 레지스터를 누설시킵니다 → soft-float 처리와 모든 FP 명령어에서 실패하는 빌드 체크가 필요했습니다.
- 가이드 버튼을 누르면 콘솔이 교착 상태에 빠졌습니다. (XAM 입력 공급 스레드가 XAM을 호출하고 있었기 때문입니다) → 모든 XAM 호출은 다른 하드웨어의 자체 스레드로 이동해야 했습니다.
- 드라이버 스레드가 가이드가 열려 있는 동안 기아(starved) 상태에 빠졌습니다 → 이를 통해 커널이 시스템 스레드를 우선순위 9로 제한하는 것을 발견하고, 드라이버를 해당 우선순위로 승격시켰습니다.
어댑터
부팅 전에 연결된 것은 무시되었고 → 커널의 미할당 USB 장치 목록과 드라이버에 이를 다시 제공하는 루틴을 찾았습니다. 작업 흐름은 이렇습니다. 목표물에 시야를 부여합니다. 드라이버는 상태 블록(status block)과 로그 링(log ring)을 메모리에 기록하고, Claude가 매 테스트 후 네트워크를 통해 이를 읽었습니다. 적절한 도구를 제공합니다. 커널용 Ghidra, MCP(Microcontroller Programming), 크로스 컴파일러(cross-compiler), 그리고 콘솔의 디버그 포트입니다. 스스로 빌드 → 업로드 → 로그 읽기 루프를 실행했습니다. 실수를 저지르면 빌드가 실패하도록 했습니다. 힘들게 배운 모든 규칙은 빌드 스크립트의 검사 항목이 되었고, 따라서 수정된 버그는 계속 고정되었습니다. 저는 손 역할을 했습니다. 동글을 꽂고, 컨트롤러를 페어링하고, 콘솔이 멈췄을 때 재부팅하며, 화면에 표시된 내용을 설명했습니다. 몇 시간 전에 r/360hacks에 공개했고(스레드는 여기), 몇몇 사람들이 자신들의 컨트롤러로 테스트하기 위해 어댑터를 주문하고 있습니다. 아직 초기 단계이므로 피드백을 환영합니다. 제출자: /u/Hot-Ad2974 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/ClaudeAI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기