謝辞
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、走査に walkdir、圧縮の展開に flate2 / zip / rars、ハッシュに sha2、直列化に serde、そのほか regex / once_cell / image を使っています。 3D 表示は WebGL2 で実装しました。各ソフトウェアの作者・貢献者に感謝します。
学習用データセット
実サーバーの実データ(車両・EUP・エモート・マップ・テクスチャ・武器等)で一つひとつ挙動を検証できたことが、本ツールの正確さを支えています。 推測で埋めないという方針を貫けたのは、確かめる相手がここにあったからです。データを提供・許諾いただいた関係者に感謝します。
参照した総量は 946 リソース / 106,653 ファイル / 62.0 GB。ファイル数での内訳は次のとおりです。
このうち、バイナリ形式の解析に直接使ったものは 48,205 ファイルです。
| 形式 | 件数 | 形式 | 件数 | 形式 | 件数 |
|---|---|---|---|---|---|
| .ydr モデル | 20,359 | .ybn 当たり判定 | 2,859 | .ycd アニメ | 1,295 |
| .ytd テクスチャ | 10,994 | .ytyp 型定義 | 2,247 | .rel 音声定義 | 197 |
| .ymap 配置 | 3,707 | .meta 定義 | 1,433 | .awc 音声 | 145 |
| .yft 破壊 | 3,428 | .ydd 辞書 | 1,381 | .rpf 書庫 | 136 |
| .ymt ped 定義 | 24 |
本ソフトウェアの規模
バイナリ構造の解析から 3D 表示・信頼性監査まで、FXO は複数の言語・層にまたがって書かれています。現時点のソースコードは 128,111 行です(生成物・依存ライブラリ・Web 側への複製は含みません)。
言語
層
このほかに、形式の解析結果をまとめた文書が 12,389 行あります。分かったことだけでなく、分からなかったこと・試して外れたことも残しています。後から読む人が同じ壁で止まらないためです。
開発後記
ここまで、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 を育てていきます。
— 野澤
本ツールはコミュニティ資料を基にした非公式の解析ツールです。各商標・著作権はそれぞれの権利者に帰属します。誤りや不足があれば、それは本ツール側の責任です。