Claude Code로 Xbox 360 커널을 리버스 엔지니어링하여 Series X|S 컨트롤러 네이티브 드라이버를 개발함
Claude Code reverse-engineered the Xbox 360 kernel and wrote a native driver so Series X|S controllers work on it
핵심 요약
Claude Code를 활용해 Xbox 360 커널을 분석하고 Series X|S 컨트롤러를 무선으로 연결하는 네이티브 드라이버를 성공적으로 개발했습니다.
- 커널 리버스 엔지니어링 — Ghidra MCP 서버를 통해 Xbox 360의 비공개 USB 스택과 XAM 입력 경로를 분석함
- 드라이버 개발 — xone의 무선 프로토콜을 C로 포팅하고 커널 모드 시스템 DLL로 구현함
- 기술적 난관 해결 — 레지스터 저장 방식 차이, 부동 소수점 컨텍스트 부재, 데드락 등 복잡한 커널 버그를 수정함
- 워크플로우 자동화 — Claude가 빌드, 업로드, 로그 분석 루프를 스스로 수행하며 개발 효율을 극대화함
마이크로소프트 Xbox 무선 어댑터(Series X|S 컨트롤러용 USB 동글)는 원래 Xbox 360에서 절대 안 돌아갔음. 이거 그냥 MediaTek Wi-Fi 칩인데, 펌웨어 업로드부터 무선 설정, 페어링, ECDH 보안 핸드셰이크, 마이크로소프트 GIP 컨트롤러 프로토콜까지 전부 호스트 기기에 의존하는 물건이라서 그럼. PC에서는 마이크로소프트 드라이버가, 리눅스에서는 xone이 그 역할을 하는데, 360에는 그런 게 아예 없었거든.
내 커스텀 360(커널 17559)에서 쓰고 싶어서 Claude Code로 직접 만들어버림. **무료 오픈 소스(GPL-3.0)**니까 가져다 써라: https://github.com/Jacckii/Xbox360-Series-Controllers-Native
기능: Series X|S 컨트롤러 최대 4개를 360에 무선으로 연결해서 일반 컨트롤러처럼 쓸 수 있음. 진동도 잘 되고 가이드 버튼도 대시보드랑 게임에서 전부 정상 작동함. 부팅할 때 알아서 로드되니까 마이크로소프트 순정 어댑터랑 다를 게 없음.
Claude가 한 일
-
MCP 서버를 통해 Ghidra에서 360 커널의 비공개 USB 스택(Usbd)이랑 XAM 입력 경로를 리버스 엔지니어링함: 런타임 USB 클래스 드라이버 목록, 전송 블록 레이아웃, 어떤 DPC에서 어떤 콜백이 실행되는지, 가이드 버튼을 위해 XAM이 사용하는 콜백 테이블까지 다 뜯어냄
-
xone의 MT76 무선 코드, 페어링, ECDH P-256 핸드셰이크, GIP 프로토콜을 이식 가능한 C 코드로 옮기고, 360용 커널 모드 시스템 DLL로 작성함
-
PowerPC 함수 훅(명령어를 트램펄린으로 재배치)을 짜서 컨트롤러 입력을 XInput으로 넘겨줌
-
디버그 모니터로 메모리를 읽어가면서 실기기에서 직접 디버깅함
잡아낸 버그들
-
툴체인이 레지스터를 32비트로 저장하는데 커널은 64비트를 원함 → 모든 커널 콜백 주변에 asm 썽크(thunk) 추가
-
커널 DPC에는 부동 소수점 컨텍스트가 없는데 가변 인자 함수가 멋대로 FP 레지스터를 건드림 → 소프트 플로트(soft-float) 적용하고 FP 명령어가 하나라도 나오면 빌드 실패하게 막음
-
가이드 버튼 누르면 콘솔이 멈춤: XAM 입력을 처리하는 스레드가 XAM을 호출하고 있었음 → 모든 XAM 호출을 다른 하드웨어 스레드의 전용 스레드로 분리함
-
가이드 메뉴 켜져 있을 때 드라이버 스레드가 굶어 죽음 → 커널이 시스템 스레드 우선순위를 9로 고정한다는 걸 알아내서 드라이버 우선순위를 그만큼 올림
-
부팅 전에 어댑터 꽂아두면 무시함 → 커널의 미사용 USB 장치 목록이랑 드라이버에 장치를 다시 할당하는 루틴을 찾아내서 해결함
작업 방식
-
타겟 기기에 눈을 달아줌. 드라이버가 상태 블록이랑 로그 링을 메모리에 쓰면, Claude가 테스트할 때마다 네트워크로 그걸 읽어 들임.
-
적절한 도구를 쥐여줌. 커널용 Ghidra MCP, 크로스 컴파일러, 콘솔 디버그 포트를 연결함. 빌드 → 업로드 → 로그 읽기 루프를 지가 알아서 돌림.

