世界を動かす技術を、日本語で。

1998年の「Ultima Online」デモサーバーのリバースエンジニアリング

概要

  • 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デモサーバーの完全復元
  • オープンソース公開 で解析・貢献を広く呼びかけ
  • 歴史的ゲームの内部構造解明と保存 への大きな一歩

Hackerたちの意見

UOエミュレーターのシーンがネットワークプログラミングにハマるきっかけになったんだ。オンラインゲームでこんなに多くの補助的なプレイメカニクスを見たのは初めてで、3D MMOはUOが提供していた面白い経済や建築、探索の要素をかなりダウングレードしちゃってる気がする。PvPやクエストの要素は他のゲームの方が良いかもしれないけど、それでも魅力的だったし、ソロでもグループでも、ランダムな人とカジュアルにやり取りしながら、気分次第で切り替えられるのが良かった。

もしかしたら、そこにチャンスがあるかも?正直、今のMMOの世界はあまり動きがないね。WoWや古いRuneScape、ファイナルファンタジーオンラインくらいしか、あまり価値のあるものはないかな。

いくつかの古い3D MMORPGは、そういったメカニクスを取り入れようとしたことがあったよ。例えば、1) Asheron's Call(非常にアクティブなMODシーンがあって、今はエミュレーターシーンもある)。でも、サーバーはUOほど人気じゃないと思う。2) Shadowbane(これはギルドベースだったけど、ちょっとアウトローになってランダムな人やギルドとPvPするのが楽しかった)。

なんだか3D MMOは面白い要素がかなり減ってしまったように思う。残念ながら、2つのことが真実であることがわかった。1) 大多数の人はこれを望んでいなくて、レールに乗っている方が好き。2) こういうゲームに最も惹かれる2つのグループは、片方がいるともう片方がゲームを辞めてしまうようなダイナミックになる。

このプロジェクトには10年間不定期に取り組んできたけど、最近のLLMの進展のおかげで、ようやくこの終わりのないタスクを完成させることができた。自分のMFC C++の逆コンパイルプロジェクトに取り組んでるんだけど、LLMがこれにどれだけ役立つかは本当に驚きだよ。

これ、自動的にLLMを使ってるの?それともローカルかクラウド?

昔のUltimate Onlineは楽しんでたよ。最近は、TazUOゲームクライアントのスクリプトをPythonで書くのが楽しい。ちょっと古いPython 3のバージョンだけど、RazorやSteamUOでのスクリプトよりはずっと進んでる。静かなシングルプレイヤーのシャードで遊びたいなら、Mementoが楽しいよ。

UOを試してみたい人には、まだアクティブなプレイヤーベースがあるゲームだよ。UO Outlandsみたいなサードパーティのサーバーもあって、オリジナルのゲームプレイに近いんだ。つまり、今のMMOに慣れている人にはかなり厳しいってこと。プレイヤーが襲いに来て、アイテムを失うこともあるしね。今、サーバーには2500人以上のプレイヤーがログインしてるから、まだまだ活発だよ。

OOooOooOoooOoO

そうだね、UOのアウトランズは元のUOよりも運営がうまくいってる気がする。Discordもかなり活発で、約2万人がいるよ。

初めての本格的なプログラミングの成果は、Ultima Onlineのシャード用のウェブサイトを作ったことだった。すごくひどいPHPとHTMLを書いたけど、その後20年以上も動いてたんだ。いい思い出だよ!UOの周りにまだアクティブなコミュニティがあるのには驚いた!とにかく、これはすごいね。シェアしてくれてありがとう!

僕も似たような経験があるよ。当時はゲーマーがオンラインコミュニティの大きな部分を占めてたから、実際に使われてエンゲージメントが得られるサイトを作りたいなら、そのオーディエンスに向けて作るのがいい戦略だった。もちろん、自分がそのオーディエンスの一部であることも助けになるよね。

同じような経験があるよ。ウェブサイトを作ったり、フォーラムのインストールを管理したりしてたんだけど、時間が経つにつれて、シャードを運営してた人たちがエミュレーターのコードも書いてみないかって誘ってくれたんだ。12~13歳の頃(90年代後半から2000年代初頭)で、エミュレーターの名前はもう覚えてないけど、多分POLだったと思う。シャードのコンセプトは、UO:Renaissanceの前の公式サーバーにできるだけ近づけることだったから、T2Aのように見えるようにかなり頑張った。たくさん学んだし、後にRunUOが出て少し安定した頃(2003年ごろ)には、POLでやってたことをC#に移行する手伝いもした。もっと学ばなきゃいけなかったけどね。このシャードで働いてた他の人たちはみんな大学でCSを勉強してたり、すでにプログラマーとして働いてたりしたから、私はスクリプトを書ける子供だった。こういう経験があったからこそ、後にプロになれたんだと思う。実際、リアルなテック企業での最初の仕事も、インターンのポジションが開いたときに、彼らの一人が推薦してくれたおかげだった。ある意味、UOとプライベートシャードのおかげで今のキャリアがあるんだ。

私の最初の本格的なプログラミングの成果は、Ultima Onlineのシャードのためにウェブサイトを作ったことです。私も!二つ目はマップを変更すること(静的アイテムを削除したり、新しい島や建物を追加したり)で、三つ目はverdata.mulを変更して新しいアニメーションやアイテムグラフィックを追加することでした。非公式のPOLサーバーでUltima Onlineをプレイしてたおかげで、ITの世界に入ることができました。それまでは会計士になるために勉強してたんだけどね。

私の場合は、UOInjectっていうアシストツールを使って鉱石を自動で採掘することだった。そこで使われてた言語はVisual Basicだったと思う。プログラミングを始めたのは、純粋に必要に迫られてだった。

私の最初のウェブサイトはChesapeakeのギルドのためのもので、いろんなスキルをマクロ化するためのスクリプトを組み合わせて作ったのが最初の「実際のプログラミング」プロジェクトだった。それがきっかけで初めてIRCに参加し、その後freenodeに行くことになったんだ。

UOの周りにまだアクティブなコミュニティがあるなんて驚いた!もしMMOだったら、プライベートサーバーのコミュニティが無限にあるよね。ゲームの名前は忘れちゃったけど、たしか「City of Heroes」だったかな?何年も前にサービスが終了したのに、数年後に誰かがプライベートサーバーを立ち上げたんだ。そういえば、前にも言ったけど、昔のShockwave Onlineゲームには、サーバーを再構築したり、Shockwaveのランタイムやデコンパイラを作ったりしてるニッチなコミュニティがあるんだよね。ゲーム間で似たような問題を解決しようとしてるから、重なり合ってるんだ。 ;)

引用: 「もし誰かが1997年から2003年の間のオリジナルのUltima Onlineサーバーからdynamic0.mulやdynamic0.bkp(サーバーのセーブデータ)、regions.txt(スポーン定義)、resbank.mul(リソース定義)のファイルを持っていたら、送ってもらえるとすごくありがたいです。オリジナルのdynamic0.mulやdynamic0.bkpファイルが本当に失われているとは考えにくいです。きっといくつかの安全な場所にバックアップされているはずですから。これらのファイルは、Ultima Onlineの世界コンテンツを非常に正確に再現するために非常に価値があります。」

2000年のUltima Online 2のトレーラーは忘れられないな。皮肉なことに、使われてた音楽の中に「これは迷信じゃない」って歌詞があったんだよね。このデモが拡張パックに入ってたなんて気づかなかった。

古いMMOサーバーのリバースエンジニアリングが大好き。MapleStoryのカスタムサーバーがきっかけで中学・高校でプログラミングを始めたんだ。今でもMapleStoryのカスタムサーバー(他のMMOでも)に戻りたい気持ちがあるけど、正直、プレイヤーがいない広大なオープンワールドはちょっと怖いし、悲しいし、なんか不気味に感じる。少なくとも、ちょっとした「命」をサーバーに加えたいな、たとえそれが余計なプレイヤーっぽいNPCだけでも。

ああ、UO…いい思い出だな。カードを持ってなかったから、サイバースミスに自転車で行ってプリペイドの時間を買ったのを覚えてる。昔はナパバレーのシャードで遊んでたけど(Catskillsには勇気がなかった)。今はUOの体験が恋しいけど、そんなことに時間をかける余裕がないんだよね。

eqclassicの最後の生き残りの開発者として、これには興味を持ったけど、ツールの使い方や全体のプロセスについてもっと詳しい話が欲しかったな。それでも、いい読み物だった。あの時はLLMを持ってなかったけど、未来の3年後のPowerPCバイナリからいくつかのデバッグシンボルはあったから、少しは役に立ったよ。ファイル名の中に「packet_handler」や「entitylist」みたいに妙に馴染みのあるものがあったな。最終的なフロンティアは、他を磨く前に完璧なネットコードを持つことだけど、今までに数百時間無駄にしたからな。ソースをちょっと見ただけだけど、上に信頼できるメカニズムが使われてるようには見えないな。TCPがずっと使われてるから?面白い…そうだとしたら、当時のMMOにしては「遅い」選択だったのかもね。