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

デューク・ニュケム:ゼロアワー N64 ROM リバースエンジニアリングプロジェクトが100%達成

概要

Duke Nukem Zero Hour のN64版デコンパイルプロジェクトの利用手順まとめ。 Ubuntu 20.04 または WSL2 環境推奨。 ROMファイルの所有 が前提条件。 ビルド方法、依存パッケージ、Docker利用法 などを詳述。 デバッグやツール の利用方法も解説。

Duke Nukem Zero Hour N64 デコンパイルプロジェクト利用ガイド

  • 本リポジトリDuke Nukem Zero Hour のN64版デコンパイルプロジェクト
    • ROM所有者のみ 利用可能

依存パッケージのインストール

  • Ubuntu 20.04 または WSL2 環境推奨
  • 必要パッケージをインストール
    • sudo apt update
    • sudo apt install make git build-essential binutils-mips-linux-gnu cpp-mips-linux-gnu python3 python3-pip
  • Python 3.8以上 が必要
  • Pythonパッケージのインストール
    • pip3 install --upgrade pip
    • pip3 install -U splat64[mips]
    • pip3 install -r requirements.txt

ビルド手順

  • リポジトリのクローン(サブモジュール同時取得)
    • git clone https://github.com/Gillou68310/DukeNukemZeroHour.git --recursive
  • ディレクトリ移動
    • cd DukeNukemZeroHour
  • Duke Nukem Zero Hour US ROM をリポジトリルートに配置し、baserom.us.z64にリネーム
  • ROM抽出
    • make setup
  • ROMビルド
    • make --jobs
  • 成功時、build/us/dukenukemzerohour.z64ファイル生成

他バージョン対応

  • フランス語版 もサポート
    • ROMをbaserom.fr.z64にリネームしてリポジトリルートへ配置
    • makeコマンドにVERSION=frを付与

NON_MATCHINGビルド

  • 機能的には同等だがバイトレベルでは一致しない関数を含むビルド
    • makeコマンドにNON_MATCHING=1を追加

Docker環境

  • 依存関係を含む Dockerイメージ のビルド・実行
    • docker build --no-cache . -t dukenukemzerohour
    • docker run --rm -ti --mount src=$(pwd),target=/dukenukemzerohour,type=bind dukenukemzerohour
  • WindowsまたはMacでフォルダをバインドする場合、 Mutagen Extension の利用を推奨
    • docker --context=desktop-linux-mutagen run --rm -ti --mount src=$(pwd),target=/dukenukemzerohour,type=bind dukenukemzerohour
  • Docker起動後、上述のビルド手順を実行

デバッグ・ツール利用方法

デバッグ

  • mupen64plus + gdb によるデバッグ(現状はWindows限定)
    • 最新gccでビルドするため、makeコマンドにMODERN=1を追加
    • gdbサーバー起動:tools\debugger\win32\gdbserver.bat
    • gdbクライアント起動:tools\debugger\win32\gdbclient.bat
  • VSCode でのデバッグも可能
    • gdbサーバー起動後、VSCodeの「GDB Client(Win32)」構成を実行

主要ツール

  • asm-differ :ソースとターゲットのアセンブリ差分比較ツール
  • decomp-permuter :コード調整・再ビルド・スコアリング、レジスタ割り当て問題解消支援
  • mips2c :アセンブリからCコードへの変換ツール
  • splat :n64splitの後継、ROMデコンパイル支援

注意事項

  • ゲームROMの所有が必須条件
  • 非公式プロジェクト であり、利用は自己責任

Hackerたちの意見

「N64用のデューク・ニューケム ゼロアワーの逆コンパイルです。注意:このリポジトリを使用するには、ゲームのコピーをすでに所有している必要があります。」

みんな今は持ってるよね、もちろん。

どうして人(またはグループ)がこんなに時間とエネルギーを投資するのか知りたいな。好きなタイトルに取り組むホビイストゲーマーのグループがいるのかな?デジタル保存が目的なの?

お前は一度も「ケツを蹴って、ガムを噛んだ」ことないんだな。

同じく。これに関するプロジェクトページとか、背景や理由、歴史を説明してるものはあるのかな?すごく興味深いと思う。Readmeは技術的すぎて、プロジェクトの魂についての説明が欠けてるよ。セクション1、タイトル。セクション2、もうUbuntuや依存関係の話になってる。セクション「なぜ?」はどこにあるの? :-)

それに加えて、スピードランのバグハンターたちもこういったプロジェクトに参加することが多いよ。例えば、トワイライトプリンセスの逆コンパイルは主にスピードランコミュニティのために始まったんだ。

ヴィンテージシンセのファームウェアをリバースエンジニアリングするのにかなりの時間を費やしたよ(現代のゲームよりはちょっと簡単)。この2つのヴィンテージシンセのROMの完全なエンドツーエンドの注釈を作ったんだ:- https://github.com/ajxs/yamaha_dx7_rom_disassembly - https://github.com/ajxs/yamaha_dx9_rom_disassembly そもそも、これらのデバイスがどう動いてるのか知りたくて始めたんだ。結果的に、エンジニアとしての視野を広げるために本当に貴重なスキルをたくさん学んだよ。すごく頭の良い人たちと話す機会もあったし、実際の作業はすごく楽しい。大きくて技術的なジグソーパズルを組み立てるみたいな感じだね。私の場合、楽しいファームウェアのモッドをリリースできるようにもなったよ: https://github.com/ajxs/yamaha_dx97 どうやって作業したか気になる人のために、ちょっとしたチュートリアル記事も書いたよ: https://ajxs.me/blog/Introduction_to_Reverse-Engineering_Vin... これって考古学にも似てるかも。私の場合、DX7は42年前のものだけど、コンピュータの世界ではずいぶん昔のことだよね。異なるエンジニアがどうやって設計や構築をしていたのか、ちょっとした洞察を得られるんだ。N64の開発は比較的新しいけど、記憶によれば、そのコンソールには開発を難しくする面白い制約があったと思う。

もしかしたら、彼らはそのゲームが本当に好きなんじゃないかな。これは一種のトリビュートだよね。私も子供の頃に大好きだったゲームがあるんだ。『ロックマンバトルネットワーク2』。あのゲームは私の人生を変えたんだよ。英語を学んでプログラマーになったのもそれのおかげ。コレクションには物理的なコピーが2つあって、1つは未開封の状態。たまにIDAでゲームを開いて、ちょっと逆アセンブルしてみたりするんだ。ゲームを理解したいだけなんだよね。ROMハッキングコミュニティのすごい人たちみたいに、時間も dedication も、低レベルのプログラミング知識もないけど、頑張ってるよ。

『ロード・オブ・ザ・リング』みたいな作品のビットキャラクターを何時間も分析してる人たちがいるよね(青い魔法使いはどこに行ったの?トム・ボンバディルは誰?)とか、『スター・ウォーズ』とか。これは似たようなファンの執着だよ。ファンっていうのはファナティックから来てることを忘れないで。

これがテキストアドベンチャー/インタラクティブフィクションコミュニティの始まりだね。何人かのハッカーがInfocomのz-machineを逆アセンブルして、新しい言語やコンパイラを作ったから、新しいゲームが作れるようになったんだ。

保存と改造のしやすさ。新しいコンソールユニットはもう作られてないし、古いものの数も限られてる。壊れることもあるし、現代のモニターやテレビと互換性のない出力ビデオフォーマットの問題もある。エミュレーションはあるけど、完璧じゃないし、要求されるスペックも高い。デコンパイルを使えば、異なるプラットフォーム用のネイティブバイナリを作れる。これでゲームをプレイするのがもっと簡単でアクセスしやすくなるんだ。

今年の初めにGame On Expoで『キャッスルヴァニア: シンフォニー・オブ・ザ・ナイト』のデコンパイルについて話したんだけど(https://github.com/xeeynamo/sotn-decomp)、まさにこのことについて少し話したんだ。そこで作業してるほとんどの人はこのゲームが大好き。動機は様々で、ポートを見たい人、モッドを作りたい人、できるだけ学びたい人、保存したい人がいる。僕もその挑戦が好きなんだ(数独みたいな感じ)。長くやってると、コンパイラの歴史や理論を学ばなきゃいけないし、ゲームを作るためのビジネスやエンジニアリングのプレッシャーを理解する必要がある。たまに、ゲームの一部がどうしてそうなってるのかもわかる。SotNの作業をストリーミングしてるから、もっと知りたい人はチャットで質問してくれれば嬉しいよ - https://m.twitch.tv/madeupofwires/home

僕は『コスモのコズミックアドベンチャー』(DOS, 1992)を再実装した人間で、最初の理由は、そんなに性能の低いハードウェア(IBM ATでも動く)でどうやってあのグラフィックトリックができたのか知りたかったからなんだ。このゲーム自体は特別なものじゃなかったけど、僕の子供時代にとって大事な作品だったから、愛着があった。PCプラットフォームや80年代のCエコシステム、自分のエンジニアとしての趣味についてもたくさん学んだよ。 https://github.com/smitelli/cosmore https://cosmodoc.org/

100% Cに逆コンパイルされてるけど、まだ完全にはラベル付けされてないんだ。だから、自動生成された名前があちこちに散らばってる。今誰かがポートしようとするのを見るのは面白そうだね。

LLMはラベリングに向いてると思う?それとも、誤検出のリスクが時間の無駄になるだけかな?

N64に移植されてゲームに使われたビルドエンジンのソースコードが、非商用利用のために自由に使えるなら、関数名や変数名をマッピングするのに使えるかな?

Ghidraみたいなツールが無料で使える今、「100% decompiled to C」っていうのは、あんまりハードル高くないよね。

Gillou68310は99%の作業を一人でやってたみたいで、すごい献身だね。『ゼルダの伝説 トワイライトプリンセス』も進展してるよ。https://decomp.dev/zeldaret/tp

ついでに、キャッスルヴァニア: シンフォニー・オブ・ザ・ナイトのデコンプも順調に進んでるよ(まだまだやることは多いけど) https://github.com/Xeeynamo/sotn-decomp

LLMはこの種のリバースエンジニアリングに向いてるのかな?

その方法でかなりのリラベリングができるよね。別のファイルに対して「バイナリに合うまで修正する」ループを試してみるのもいいかも…でも、実際にそれを書いた人は見たことないな。関連する試みはあるけど、ちょっと違うプロジェクトもあるよね。例えば、これとかね。https://github.com/louisgthier/decompai 追記:やってみたけど、部分的な情報があるときに合理的な変数名を推測するのはめっちゃ効果的だよ。特に、何を繰り返しているか分かっているときのカウンターや一時変数の命名は、ただの退屈な手作業だからすごく楽だし、関数名の大きなパターンの意味も理解できるようになる。

ゲームをポートするためにエージェントを使ってるんだけど、ソースはあるんだ。でも、うまくいってない。LLMがライブラリをポートするのが面倒だって言って、自己負担の深い穴にハマっちゃってる。スタブをたくさん作るし、仮定を立てるから、全体が壊れちゃうんだよね。

実験はしてないけど、孤立した変数や関数のリネームには価値があるかもって思ってた。

かなり良い感じだよ。完璧じゃないけど、時間をかなり節約してくれる。一般的なライブラリ関数やよく知られたアルゴリズムを認識するのは、コンパイルやデコンパイルでボロボロになってても、超人的な能力を発揮するからね。

EFFがこの件について何か声明を出したかはわからないけど、著作権の面が心配だな。デコンパイルは(法的に)新しい創造的な作品が生まれるから成立するんだ。LLMが派生的で非変革的な作品を生み出してるって主張するのは簡単だよね。AI企業はトレーニングデータのライセンスに巨額のロイヤリティを払ってるから、余計に難しくなってる。個人的にはリスクを避けるために距離を置くけど、もしLLMでマッチするデコンパイルが「簡単」に作れるようになったら、すぐに具体的な法的前例ができるだろうね。

こっちはまだDuke Nuke Foreverを心待ちにしてるよ!…どれくらい待ってるんだろう?もう忘れちゃった(:

ジョークかどうかわからないけど、もしリリースを見逃してたら、もう出てるよ!: https://store.steampowered.com/agecheck/app/57900/

注意:このリポジトリを使うには、すでにゲームのコピーを持っている必要があります。

私は持ってなくても問題なく使えたけど、あなたは間違ってると思う。

これは法的な免責事項だよ、実際の要件じゃないからね(笑)

中国のレトロハンドヘルドをプレイする人は、自分でROMをダンプしなきゃいけないんだ。もし10ドル追加で10000 in 1バージョンを買ったら、すべてが完全に合法になるけどね!まあ、そうしなきゃいけないんだろうけど、こんな古い歴史のことで誰かが本当に刑務所に行くの?この免責事項が可愛いと思う。

なんで『デューク・ニュケム:ゼロアワー』なの?他のゲームじゃダメなの?

いい質問だね。でも、スクリーンショットがあったら、学校の友達に送れるのに。前にこれをプレイしたときは、全部シンプルでカオスな楽園だった :)

ちょっと埋もれた名作だね。プレイステーションのゲームはトゥームレイダーのクローンであまり評価されてないけど、ゼロアワーはオリジナルのデューク・ニュケム3Dと同じBuildエンジンを使ってるんだ。基準には達してないけど、3D Realms以外のデューク・ニュケムゲームの中では一番かもしれない。残念ながら、視点が三人称に変更されちゃって(未完成の一人称モードがチートとしてあるけど)、操作性が悪いんだ。ソースが公開されたから、今はそれを修正できるね。

すごいね!でも… GitHub?彼らは学ばないのかな?3、2、1… 削除通知が来る!

なんで削除するんだろう?任天堂のゲームのデコンプもGitHubにあるのに。

リポジトリをちょっと見た感じ、著作権のある素材は含まれてないみたい。デコンパイルを行うためのコードだけがアップロードされてる。

ゼロアワーは任天堂64時代の必須ゲームの一つで、デューク・ニュケムシリーズの後半で数少ない良作の一つだよ。難しいプラットフォーム要素や、ちょっと心が折れるレベルもあったけど、ゲームは一貫して豊かな設定があって、デューク3Dの魅力を再現してた。最近のパーフェクトダークの移植は素晴らしかったし、このデコンプも同じように扱われることを願ってる。