If there is someone who wants to read this article in English, please contact me. I'm not good at English, so I don't want to write in English for anybody.
Motivation
最近研究室でPS4版オーバーウォッチをやった。PS4でFPSは初めてだったのだが、アナログパッドで全くエイムが合わない。規約上問題ない様なのでキーボードとマウスをPS4で使う術を考えた。
PS4で外部デバイスを使う試みはGIMXにより行われているが、デバイスを自作する必要がある。今回はそういったデバイスの自作無しで実現することを目的とする。
現状大凡の目処は立っているものの、細かい問題が解消されず未だ出来ていない。出来た時に記事にしようと思っていたが膨大になりそうなので幾つかのパートに分ける。おそらく4,5パート程度になると思われる。
Sniffing HCI-UART
PS4コントローラー(以下DS4)とPS4本体はBluetooth2.1+EDRで通信をしている。Wifiとは異なり、Bluetoothのプロミスキャスキャプチャはとても困難なようだ。これはどうやらBluetoothのスペクトラム拡散方式である周波数ホッピングによるものらしい。
加えて、PS4ではSecure Simple Pairingというプロトコルにより動的に鍵(以下Link Key)を生成しており、これを外部から盗聴することは出来ない。
DS4とPS4の内部に格納されたLink Keyを取り出すことは困難らしい(読み出しされにくい領域に置く)。実はPS4-DS4間のLink Keyを読み出す方法はあるのだが、これに外部デバイスを必要とする(どこかのパートで書く)。
果たしてBluetoothの盗聴は不可能に思われるが、実は物理的なHackでなんとかなる。BluetoothのチップにUARTで通信しているところを直接抜き取れば良い。
この記事に沿って行った。
まず、ボタンの壊れたDS4を購入(2000円程度で買えた)して分解する。
先の記事の写真と見比べると分かるが基板が違う。DS4は新旧2種があり、どうやらそれによって基板も変わったらしい。@TA7368PG氏によれば3種以上基板があるようだ。
真面目にデータシートと基板を読む。DS4に搭載されているBluetoothチップはAtheros AR3002でこれは10, 11番ピンにTx, Rxが配置されている。
基板を眺めるとおそらくデバッグ用のパッドに伸びている。ここに線をはんだ付けする。
Rx, Tx, GNDを取ってきてブレッドボードに配置する。シリアル通信モジュールは記事に倣いFT232を搭載したものを用いる。ボーレートが3Mbps以上であればなんでも良い。
その後、これをコンパイルして終わり。
ただ、このプログラムはTx, Rx用に2つモジュールがなければ動かない。そこでPORT2をコメントアウトしてfd2に-1をセットすると上手く動く。
小話
ハードウェアに関して全く詳しく無いので@TA7368PG氏と@ka1l氏にTwitterで聞きまくった。ありがとうございました。と言うか最近人々にTwitterで質問しまくってる。
どう考えてもこれを最初にやるべきなのだけど、しばらくsniffer無しで頑張っていた。しかしどうも煮詰まったので止むを得なくPS4ごと買った(これまでPS4を持っていなくて研究室においてあるもので実験していた。流石に人のコントローラーを分解するわけにはいかない)。
基板が違った時はマジで詰んだと思った。
メルカリで落としたコントローラーを分解したら犬の毛が入ってて笑った。
本当は音声端子を剥がしてそこからケーブルを出したかったのだが、はんだ剥がしがつらすぎて諦めた。
Tx, Rx用にモジュールが2つ必要で秋月で注文した。その後5年前に買ったきり一切触っていない回路箱を覗いたら何故かFT232が載ったモジュールがあったのでとりあえず実験した。