LLMでN64ゲームを逆コンパイル

「ゲームの逆コンパイル」と聞くと、一部のマニアックな開発者だけの世界に思えるかもしれません。しかし最近、LLM(大規模言語モデル)を活用してレトロゲームのバイナリを元のソースコードに復元する試みが注目を集めています。

オーストラリアの開発者Chris Lewis氏が、AIコーディングエージェントを使ってNintendo 64タイトル「スノーボードキッズ2」の逆コンパイルに取り組んだ事例が話題になっていたので、その手法と得られた知見をまとめてみました。

逆コンパイル(デコンパイル)とは何か

そもそも逆コンパイルとは、コンパイル済みのバイナリコード(機械語)を人間が読めるソースコードに戻す作業のことです。ゲームの保存活動や、セキュリティ研究、古いソフトウェアの移植などで広く使われています。

従来はGhidraのような専門ツールを使い、アセンブリコードを手作業でC言語に書き直していくのが一般的でした。熟練した技術者でも、1つの関数を正確に復元するのに何時間もかかることがあります。

LLMが逆コンパイルに使える理由

ここでLLMの出番です。Claude やGPTといった大規模言語モデルは、大量のソースコードで学習しているため、アセンブリ命令のパターンから元のC言語コードを推測できる場合があるんですよね。

Lewis氏のアプローチでは、まずロジスティック回帰モデルで「簡単そうな関数」から優先的に処理していきました。命令数や制御フローの複雑さをもとに難易度を推定し、Claudeに渡して一発でC言語に変換してもらう。この「ワンショット逆コンパイル」が初期段階では驚くほど効果的だったそうです。

実際に、マッチング率(元のバイナリと一致するコードの割合)は25%から58%まで一気に上がりました。

壁にぶつかるロングテール問題

しかし、ここからが大変だったようです。簡単な関数を処理し終えると、残るのは複雑で難解なものばかり。同じアプローチでは進まなくなります。

そこでLewis氏が取り入れたのが「関数の類似性」を利用する手法でした。アセンブリ命令のテキスト埋め込み(エンベディング)を計算し、すでに逆コンパイル済みの関数と構造が似ている未処理関数を優先的に攻略していく方法です。

似た関数のコードを参考例としてLLMに渡すことで、パターン認識の精度が上がります。この改善により、マッチング率は75%付近まで到達しました。

それでも残る25%の壁

ただ、75%を超えたあたりで再び停滞したとのこと。残りの関数は参考になる類似コードもなく、アセンブリの構造自体が特殊なケースが多いためです。

この「ロングテール」問題は、LLMエージェントのコスト問題とも通じるところがあります。簡単なタスクはAIで一気に片付くけれど、残りの難しい部分に不釣り合いなコストと時間がかかるという構造的な課題ですね。

実務に活かせるポイント

この事例から得られる教訓は、ゲーム逆コンパイルに限った話ではありません。

まず、LLMは「80%の仕事」を劇的に加速するということ。レガシーコードの解析、ドキュメントのないAPIの調査、セキュリティ監査など、定型的なパターンが多い作業では非常に有効です。

一方で、残りの20%には人間の専門知識が不可欠という点も明らかになりました。LLMコーディングの性能はハーネス(つなぎ方)で決まるという話とも重なりますが、AIをどう組み込むかの設計が成果を大きく左右します。

また、類似性ベースのアプローチは他の分野にも応用できそうです。既知の解決策を参考例として提示するRAG的な手法は、コード生成やバグ修正でも同じ発想が使えるかもしれません。

まとめ

LLMを使ったゲーム逆コンパイルは、AIコーディングエージェントの可能性と限界を同時に示してくれる興味深い事例だと感じました。「簡単な部分を一気に処理→類似性で中間層を攻略→最後は人間の手で」という三段階の構造は、多くのソフトウェアエンジニアリングタスクに当てはまりそうです。

レトロゲームの保存に興味がある方はもちろん、AIを実務のコード解析に活かしたいと考えている方にも参考になる事例ではないでしょうか。

参考リンク