謝辞
FXO(FiveM eXtended Operations)は、多くの先人の研究・実装・公開資料の上に成り立っています。 本ツールが扱う GTA V / RAGE エンジンのバイナリ形式や FiveM の仕組みは、公式に完全な仕様が 公開されているものではなく、コミュニティによる長年の解析の蓄積があってはじめて理解できました。 ここに、参考にさせていただいた成果と、その作者・コミュニティへの敬意と感謝を記します。
参考にした主な研究・実装
バイナリ形式の理解にあたっては、既存実装を クリーンルームで参照しました。すなわち、 構造レイアウトやアルゴリズムの事実(オフセット・ビット配置・復号手順)を理解の手がかりとし、 実装は FXO 独自に書き起こしています(コードのコピーではありません)。
-
CodeWalker
— Neodymium / dexyfex ほか
RSC7 ページドリソース、YDR / YFT / YTD / YBN / YMAP / YCD、Clip(アニメーション)、 Drawable / Skeleton の各バイナリ構造の理解に最も多くを負いました。ycd のチャンネル復号や スキニング行列の考え方も本実装の基礎です。
-
RAGE リサーチ・コミュニティ
RSC7 の system / graphics セグメント、フラグからのサイズ復元(size-from-flags)、 仮想アドレス解決といった、ページドリソースの根幹となる公開知見。
-
grzyClothTool / EUP コミュニティ
ShopPedApparel(EUP・衣装)のスロット構成、creature / ped ymt との対応関係の理解。
-
dpemotes とエモート制作者たち
エモート定義(AnimationList)の慣習と、カスタムアニメの同梱形式。実データでの検証に活用しました。
-
Cfx.re / FiveM 公式ドキュメント・ネイティブ
fxmanifest、リソース構成、data_file、ストリーミングの規約。Asset Escrow の位置づけの理解。
-
FiveM サーバー運営・セキュリティコミュニティ
バックドアの実手口(リモートコード実行・画像偽装・情報持ち出し等)に関する注意喚起。 リソース信頼性監査のルール設計の参考にしました。
使用したオープンソース
デスクトップ基盤に Tauri、解析コアに Rust エコシステム (rayon / regex / flate2 / serde / walkdir / once_cell ほか)を用いています。3D 表示は WebGL2 で実装しました。各ソフトウェアの作者・貢献者に感謝します。
学習用データセット
実サーバーの実データ(車両・EUP・エモート・マップ・テクスチャ等)で一つひとつ挙動を検証できたことが、 本ツールの正確さを支えています。データを提供・許諾いただいた関係者に感謝します。
本ソフトウェアの規模
バイナリ構造の解析から 3D 表示・信頼性監査まで、FXO は複数の言語・層にまたがって書かれています。 参考までに、現時点のソースコードの行数を示します(生成物・依存ライブラリは含みません)。
| 区分 | 行数 |
|---|---|
| Rust — 解析エンジン fxo-core | 25,174 |
| Rust — デスクトップ中核・検証ツール | 5,451 |
| デスクトップ UI JavaScript / HTML / CSS | 19,356 |
| Web 連携ライブラリ TypeScript | 5,996 |
| 開発・検証スクリプト TypeScript | 2,790 |
| 合計 | 58,767 行 |
開発後記
ここまで、FXO の開発に影響を与えてくださった方々や、技術を残してきた先人たちへの謝意を 記してきました。最後に開発後記として、私がなぜ FXO を作るに至ったのか、その背景を少しだけ お話ししたいと思います。
はじめまして、野澤です。私が FiveM の世界に入ったのは 18 歳の頃でした。ある方から紹介された ことをきっかけにサーバー運営を始め、当時はまだ国内のサーバー数も少なかったことから、多くの方に 参加していただける環境を作ることができました。日本の FiveM サーバーランキングでも上位に入る ようになり、参加者や支援者の方々に支えられながら運営を続けていました。
しかし、そのサーバーは現在残っていません。閉鎖の理由については、当時参加してくださっていた 方々や、スポンサーとして支援してくださっていた方々にも、これまで詳しくお話ししてきませんでした。
閉鎖のきっかけとなったのは、MLO や車両データに対して行っていた最適化作業の失敗でした。当時の 私は、既存の方法とは異なる独自の最適化処理を試しており、テスト環境では一定の成果を得ることが できていました。ところが、本番環境へ反映する過程で、本来保持すべきデータまで誤って統合して しまい、YMAP をはじめとする複数の定義ファイルに不整合が発生しました。結果として、マップや リソースの正常な状態を維持できなくなり、サーバーを閉鎖することになりました。
その後、私はしばらく FiveM から離れました。一度の失敗で、それまで築いてきた環境を終わらせて しまったことを後悔する時期もありました。もう一度サーバーを立ち上げようと、GTA IV のマップを FiveM 向けに調整し、ニューヨークを舞台とした環境を構築したこともあります。しかし、その頃には 国内の FiveM サーバーも大幅に増えており、サーバーを公開するだけで人が集まり、定着してくれる 時代ではなくなっていました。その後も何度か運営に挑戦しましたが、長く続けることはできませんでした。
そこで私は、FiveM への関わり方そのものを見直しました。自らサーバーを運営するのではなく、 サーバーを支える技術や道具を作る側に回ることでも、コミュニティに貢献できるのではないか。 そう考えるようになったのです。
それからは、さまざまな国内サーバーやリソースに触れながら、不具合や脆弱性、構成上の問題を 調査するようになりました。あるサーバーで、RP の成立そのものに影響する問題を発見したことを きっかけに、裏方のエンジニアとして開発や技術支援に関わる機会が増えていきました。
サーバー運営をしていた頃は、参加者が増えることや、楽しんでもらえることが大きなモチベーション でした。現在は、新しい仕組みを調べ、これまで扱えなかったデータを理解し、技術として形にして いくこと自体が、活動を続ける原動力になっています。そうした経験と試行錯誤の積み重ねから 生まれたものが、FXO です。
FXO は、FiveM のリソースを単に整理したり、設定を書き換えたりするためだけのツールでは ありません。サーバーフォルダ全体を対象として、リソースの構成や依存関係、起動設定、テクスチャ、 マップ、車両、衣装、アニメーション、バイナリデータなどを横断的に解析するためのワークベンチです。
FiveM で扱われるファイルの中には、一般的なテキスト編集やスクリプトの知識だけでは対応できない ものも数多く存在します。FXO では、FiveM で使用される独自形式の内部構造に踏み込むことで、 従来は目視や経験に頼るしかなかった問題を、可能な限りデータとして確認できるようにしています。
また、単に問題を検出するだけではなく、リソースの最適化や検証、データ同士の衝突確認、マップや コリジョンの整合性監査、衣装データの修復や変換、起動設定の確認、不審なコードの静的解析など、 FiveM サーバーを構築・運用するうえで必要となる作業を、一つの環境で扱えることを目指しています。
解析対象のコードやバイナリを実行せず、すべての処理を利用者の端末内で完結させることも、FXO が 大切にしている設計方針の一つです。ファイルを書き換える機能についても、事前確認やバックアップ、 書き戻したデータの再検証などを行い、かつて私自身が経験したような事故を、可能な限り防げるように しています。
振り返れば、FXO の原点には、私自身の最適化ミスがあります。もし、当時の私がファイル同士の関係や 変更内容を事前に確認できる道具を持っていたなら、サーバーを閉鎖する必要はなかったかもしれません。 だからこそ FXO は、単に作業を効率化するだけではなく、問題が起きる前に気づき、安心して変更を 行うための道具でありたいと考えています。
もちろん、FXO は私一人の知識や経験だけで作られたものではありません。FiveM や GTA のデータ 構造を調査し、技術やツールを公開してきた多くの先人たちの積み重ねがあってこそ、現在の形に たどり着くことができました。私は、そうして受け継がれてきた知識を、より安全で、より分かりやすく、 より多くの方が扱える形へ整え、次の人へ渡していく橋渡し役でありたいと考えています。それが、私を 成長させてくれた FiveM コミュニティへの、ささやかな恩返しになれば幸いです。
現在は、FiveM を通じて得た知識と経験をさらに広げるため、国家資格である情報処理安全確保支援士、 通称「登録セキスペ」の取得に向けて勉強を続けています。
私自身、決して偉そうなことを言える立場ではありません。しかし、道具に本当の意味での完成はないと 思っています。利用者が増えれば新しい課題が見つかり、扱うデータが増えれば、これまで見えていな かった構造が見えてきます。技術や FiveM そのものが変化すれば、道具もまた変わり続けなければ なりません。
FXO も、完成品として置かれるものではなく、FiveM と、その中で生まれるデータや知識とともに 成長していく道具です。
これからも私は、過去の失敗を失敗のままで終わらせることなく、バイナリとデータの世界に向き合い 続けます。そして、かつての私が必要としていた道具を、これから FiveM に関わる誰かへ届けられる よう、FXO を育てていきます。
— 野澤
本ツールはコミュニティ資料を基にした非公式の解析ツールです。各商標・著作権はそれぞれの権利者に帰属します。 誤りや不足があれば、それは本ツール側の責任です。