dwgx@blog:~$dwgx
> cd ../posts

VIVE Ultimate Tracker の dongle ファームウェアを引っ剥がす

// created

Ultimate Tracker の位置トラッキングは、ホストと通信する USB dongle が担っていて、dongle の中では nRF52840 が動いている。このプロジェクトは、その dongle ファームウェアに対する俺のサードパーティ・オフライン逆向アーカイブだ。全工程で触るのは dump したバイト列だけで、実機には触れず、ベンダーのファームウェアやドライバも一切再配布しない。HTC や VIVE とは無関係で、名前は研究対象を指しているだけ、商標は各権利者に帰属する。不都合があれば issue を立ててくれれば消す。

ファームウェアは 2 つの image を貼り合わせた構成だ。img1 が app で 0x27000 に配置され、img2 が bootloader で 0xEA000 に配置される。逆向にあたっては証拠のグレード分けを一式立てて、結論には毎回レベルを付けた——[P] 実証済み、[I] 挙動は理解したが命名が欠けている、[U] 未知、[R] 実機が必要。証拠がなければ正直に [U] のまま残す、当てずっぽうはしない。

締めの時点で関数アノテーションは 999/999、img1 のソースレベル再構築は 574/599、つまり 95.8% に達した。残りの 35 個の peripheral/ABI は公式 SDK の命名と合わず、これがオフラインの天井だ。再構築の結果は、そのまま make できる標準的な C プロジェクトに組み直した。ツールチェーンは Arm GNU Toolchain 14.2。改変できる能力も検証済みで、オリジナルの round-trip は bit-identical、recovery gate は 50/50 で通過する。

ワークフローは Python でつないでいる。verify_campaign.py がオフライン検証を走らせ、recovery_preservation_check.py が文鎮化防止の gate、safe_modifiable_set.py が安全に改変できる対象を切り出し、make_flash_image.py がパッケージングをやる。刷り込み候補に格上げしたいなら、まず gate を通せ、通らないなら考えるな。ただしはっきり言っておく。機能等価は工場出荷バイトとの一致とは違うし、gate を通ったのは必要条件にすぎず、文鎮化しない保証ではない。HID identity、live metadata、app hash、ロールバックといった数点は実機なしでは根本的に無効化できないし、このプロジェクトは最初から実機書き込みには触れていない。

純粋なオフライン静的逆向を、正直な境界まで詰めた。調べられるものは全部調べ、再現可能で、根拠も残っている。その先は実機書き込みで、リスクも認可もまったく別の話だ。2026-06-30 に自主的に更新停止。これは詳細な設計図であって、出来合いの刷り込みパッケージではない。

リポジトリ https://github.com/dwgx/UltimateTracker_FirmWare