概要
- Ultima Online デモサーバーの完全リバースエンジニアリングプロジェクトの公開
- 5,000以上の関数 をC99に手作業で変換し、元バイナリと逐一比較
- 安定性・ゲームプレイの不具合修正 や未実装機能の復元
- ツール群や追加機能 も実装、幅広いクライアントバージョンに対応
- 資料・データ提供の呼びかけ と今後の貢献要請
1998年版Ultima Onlineデモサーバー完全リバースエンジニアリング公開
- 10年越しのプロジェクト完了、GitHubで全ソースコード公開
- MSVC x86で逆アセンブル、C99へ変換し元バイナリと命令単位で比較
- 約5,000関数 を移植、移行精度の高さ
- Ultima Online は1997年Origin Systems Inc.開発のMMORPG
- Windowsクライアント、サーバーはSolaris複数台構成
- 1998年10月「Ultima Online: The Second Age」拡張時にデモ版(UoDemo.exe)配布
- デモサーバーは 実際の本番サーバーコード のWindows移植版
- デモ用に一部機能削減・Stub化、Ocllo島のみプレイ可能
- サーバーエミュレータ は部分的に流用されてきたが、完全解析は初
- MSVC++ 5.0(Visual Studio 97) ビルド、プリC++98方言
解析手法と技術詳細
- radare2 で逆アセンブル実施
- Linux版UOクライアント1.25.37 のC++シンボルを利用しシンボル名推定
- 各関数を 手作業でC99に変換、制御フロー・構造体・分岐を忠実再現
- 差分はバグ修正やプラットフォーム適応のみ、 ソースで明示的にタグ付け
- 再逆アセンブルで一致確認、一致しない場合は未完了扱い
- ヘルパー関数 はインラインパターン限定で使用
- クラス階層の再現が最重要課題 :
- CEntity → CResourceEntity → CItem → CContainer → CMobile → CPlayer
- vtableによる仮想関数ディスパッチも再現
- 階層設計が固まれば翻訳効率向上
主な発見と追加実装
- 安定性バグ(クラッシュ・オーバーフロー等) や ゲームプレイバグ を修正
- 修正箇所は ソースにタグ付け、差分が明確
- デモ用に無効化・Stub化された スポーン・デイケイシステム の復元
- Ocllo島以外のマップデータが欠損していたため ツール群で再構築
- ドア、看板、装飾、テレポーター、罠、宝箱、スポーン位置等を復元
- 幻のエコロジーシステム (捕食/被食/スカベンジャー)がコード内に残存
- 関数を再接続し、 狼がウサギを追う等の生態系挙動 を再現
- リソース/プロダクションシステムは詳細データ不足で未実装
- 新規追加スキル (Meditation, Stealth, Remove Trap等)を実装
- 起動時の-featureパラメータで有効/無効切り替え可能
- アカウントシステムはデモ版に無かったため独自実装、現代的に若干改良
- 対応クライアント拡張 :1.25.30~5.0.9.1(2007-03-27)全対応、暗号化有無問わず
- 5種の暗号化方式を クライアントバイナリから逆解析
- 64bit対応 :構造体パディングで継承・vtableレイアウトを維持
- C struct埋め込みでC++継承を再現、32bit/64bit両対応
リンク・参加案内・資料募集
- コード: https://github.com/draxinar/ouo
- データ・ツール: https://github.com/draxinar/rundir
- テストセンター: https://uo.serpent-isle.com/
- 本番シャードではなく テスト用環境
- 1998年当時のUOサーバー忠実再現を体験可能
- インスピレーション元: UO:98 by Batlin and Derrick
- コード・データの詳細な内部挙動 の解説、歴史的価値
- 早期段階のためバグ報告・貢献歓迎
- オリジナルサーバーのdynamic0.mul/dynamic0.bkp/regions.txt/resbank.mul等のデータ提供を強く希望
- dynamic0.mulは 個人情報除去ツール完備、プライバシー配慮
- これらのデータで より正確なUOワールド再現が可能
まとめ
- 10年越しの労作 による 1998年Ultima Onlineデモサーバーの完全復元
- オープンソース公開 で解析・貢献を広く呼びかけ
- 歴史的ゲームの内部構造解明と保存 への大きな一歩