この記事ではDQに限らず一般的なゲーム解析の手法について書いていきます。
(どちらかというと先人達が書いたページのリンクや主流ツールをまとめるのが趣旨ですが)
(どちらかというと先人達が書いたページのリンクや主流ツールをまとめるのが趣旨ですが)
筆者自身あまり詳しくないので編集どしどしお願いします。
リンク切れを起こしているサイトがあっても消さないで下さい。
Internet Archiveで復元できる可能性があります。
Internet Archiveで復元できる可能性があります。
0.ROMの中を覗いてみる
バイナリエディタを使うことで、機械語で書かれたROMの中を見ることができます。
コンピューター内では、人間が使う「10進数」より、「16進数」を使った方が都合がいいのでその表記になっています。
コンピューター内では、人間が使う「10進数」より、「16進数」を使った方が都合がいいのでその表記になっています。
▼10~15はアルファベットを使用し、16に達したら繰り上がる。
10進数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
16進数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 |
- 進数変換
- おすすめバイナリエディタ「Stirling」
▼一番左のADDRESSは場所を示している。その右にはADDRESS1桁目の0~Fの番地に実際に収納された値(1byte)を表す、一番右は値を文字コードに変換したものとなる。
![]() |
ちなみに、FC・GB・SFC・PS等のゲームは、数字を1byteずつ下位側から収納する「リトルエンディアン」を用いていることが多く、例えば16進数で「12C」なら、バイナリ上では2C 01と収納されます。
(逆はビッグエンディアンで、01 2Cになる)
(逆はビッグエンディアンで、01 2Cになる)
例題として、次のページを参考にSFC版DQ1・2から、DQ1版スライムベスの特技スロット3を調べてみて下さい。(サイト上部に小さく書いてありますが、ヘッダに+200hされている点に注意が必要です。このページ下部のSMCヘッダ付加・削除ツールで確認。)
+ | 答え |
1.改造コードを作ってみる
ゲームをしているとき、ゲーム機は一時保存領域であるメモリ(RAM領域)の中にゲーム上の様々な情報を書き込みます。
そこで、改造コード(チートコード)を使うとメモリを強制的に書き換えることができ、
例えば強制的にLvを99にする、攻撃力を999にするということが可能になります。
そこで、改造コード(チートコード)を使うとメモリを強制的に書き換えることができ、
例えば強制的にLvを99にする、攻撃力を999にするということが可能になります。
▼これがメモリ領域。どこかにLvや攻撃力等を示すアドレスがある。
![]() |
エミュには「サーチ」という、特定の値が割り当てられたメモリを検索する機能があります。
例えば、現在HPのアドレスが知りたかったら、まず現在HPの値で検索してみます。
例えば、現在HPのアドレスが知りたかったら、まず現在HPの値で検索してみます。
▼現在HP15のときに検索してみる。
![]() |
アドレスが多すぎてどれか分からないので更に絞り込む必要がありますね。
▼HPを14に減らして再検索
![]() |
これで、7E0C09が現在HPを示すアドレスということが分かりました。
ハードやツールにより改造コードの表記が異なることがありますが、snes9xはxxxxxxyy(xx=メモリアドレス, yy=入れる値(16進数))と表されます。
この場合、7E0C09FFがHPを最大の255にする改造コードとなります。
この場合、7E0C09FFがHPを最大の255にする改造コードとなります。
特定のアイテム・モンスター・イベント・メッセージ等を呼び出すコードを作れば、没データを呼び出せる可能性もあります。
- 他、コードサーチ例
2.ゲーム内テキストを解析してみる
以下を参照。
- テキストコンバータ支援ツールGCCODE2を使った解析手順
- 旧版(GCCODE)を用いた解説
- 他
3.逆アセンブラしてみる
機械語で書かれたROMデータを、人間に(まだ)理解の可能な「アセンブリ言語」に変換し、
それを読み解くことで実際のゲーム内の処理や、色々なデータがどういう形式で、ROM内のどこに収納されているかといったことなどが解析可能になります。
デバッグモードや一部の没データはこの方法じゃないと発見は難しいのではないでしょうか。
それを読み解くことで実際のゲーム内の処理や、色々なデータがどういう形式で、ROM内のどこに収納されているかといったことなどが解析可能になります。
デバッグモードや一部の没データはこの方法じゃないと発見は難しいのではないでしょうか。
ちなみに、ハードによりアセンブリ言語は異なります。
使用するツールは下部「ハード別おすすめツール」にまとめてあります。
デバッガーが充実しているエミュを使うと、動作中の逆アセコードを見れたり、ブレークポイントで特定のアドレスの読み取りまたは書き込み時に停止させたりさせたり、トレースログで実行中コードのログを記録するといったことが可能になります。
デバッガーが充実しているエミュを使うと、動作中の逆アセコードを見れたり、ブレークポイントで特定のアドレスの読み取りまたは書き込み時に停止させたりさせたり、トレースログで実行中コードのログを記録するといったことが可能になります。
ハード名 | 言語(CPU) | 補足 |
---|---|---|
FC/FDS | Ricoh "2A03" | 6502をベースに音声機能などを同梱したカスタムCPU。 |
SFC | Ricoh "5A22" | 65c816がベース。 |
GB/GBC | Sharp "LR35902" | 8080に似ていて、Z80の追加命令がいくつか存在する。詳細、詳細2 |
N64 | MIPS "R4300カスタム" | R4300を元に微調整を行ったもの。 |
GBA | ARM7 (ARM7TDMI) Sharp "LR35902" |
LR35902は恐らくGBとの互換用。 |
GC | PowerPC "Gekko" | |
NDS | ARM9 (ARM946E-S) ARM7 (ARM7TDMI) |
ARM7は恐らくGBAとの互換用。 |
Wii | PowerPC "BroadWay" | |
3DS | ARM11 ARM9 |
ARM9は恐らくDSとの互換用。 |
WiiU | PowerPC "Espresso" | |
Swtich | ARM64 "Cortex-A57" | |
PS1 | MIPS "R3000" | |
PS2 | MIPS "R5900" | |
PSP | MIPS "R4000" | |
PS3 | "Cell Broadband Engine" | PowerPCベース |
PSVita | ARM "Cortex-A9" | |
逆アセンブラや解析に関するリンク集
- 全般
- レトロゲームのROM解析・逆アセンブルの方法メモ - 夢想メモリ
- Help:Contents/Finding Content - The Cutting Room Floor(英語)
- 没データなどゲーム内コンテンツを探すためのガイド
- 基礎用語解説 - うさみみハリケーン Ver 0.38 最新オンラインヘルプ
- 「バイナリファイルの解析」など
- せーじの技術的に語るのぺーじ
- アーカイブ、画像ファイルをバイナリエディタから解析する手法について
- Reverse Engineering Star Wars: Yoda Stories
- FC
- ギコ猫でもわかるファミコンプログラミング
- 6502マシン語ゲームプログラミング
- NES 基礎知識 - 目次 - 壁は通り抜けられませんよ
- Famicom開発室 - すずめ愛好会
- NES研究室 - 6502
- ドラクエ3のバージョン違いの謎に迫る! - youtube
- 史上初!ドラクエのデバッグをライブ配信したら、またしても33年ぶりにバグ見つけた! - youtube
- DQの当時のプログラマーによる解析作業。
- A Comprehensive Super Mario Bros. Disassembly
- SuperMarioBros Disassembly
- マリオの逆アセンブルコード解説(英語)
- The Southbird 2011 Super Mario Bros. 3 Disassembly
- マリオ3の逆アセンブルコード解説(英語)
- SFC
- GB
- GameBoy開発室 - すずめ愛好会
- お受験に出るゲームボーイ プロセッサ
- GB ASM Programming(英語)
- Pan Docs(英語)
- 技術参考資料
- Awesome Game Boy Development(英語)
- リンク集
- 詳解ポケモン赤
- ポケモン赤の逆アセンブルに詳細な解説を加えたレポジトリ
- GBA
- GC
- Switch
- MSX
Ex.ROMを改造してみる
以下を参照。
- 2から始める改造講座 - ゲイムのお部屋へよおこそ♪
- プログラム改造の第一歩 - Neoぼろくず工房
- プログラム改造の第二歩 - Neoぼろくず工房
- ゲーム解析入門 - 裏CHUNSOFT
- 風来のシレンの例。後半部分
データ部分の構造が分析できたら、「BNE2」用の定義ファイルを書くと、表組み上で簡単に編集ができます。
![]() |
SFC専用ですが、「SFCGENEditor」での定義ファイルを書くと、値だけではなく、逆アセンブルを行ったコードの編集や、固定長データ部分の参照・変更等も可能に
![]() |
改造を行った後は、「WinIPS」を使うことで、差分ファイル(ips)を作成できます。
ROMファイルそのままの配布はマズいですが、差分ファイルだけなら問題はありません。
ROMファイルそのままの配布はマズいですが、差分ファイルだけなら問題はありません。
- 他ゲーム別。知らないゲームの情報でも読めばなにかヒントになるかもしれません。
ハード別おすすめツール
逆アセンブラツールやデバッガー付きエミュはそれぞれいくつかあるので、おすすめツールやメリット・デメリット等特徴の追記を出来る方はお願いします。
総合
- Ghidra
- NSA(アメリカ国家安全保障局)が公開した汎用的な逆アセンブルツール。プラグイン(Loader)導入でゲームROMも対応可能になる。
- A first look at Ghidra's Debugger - Game Boy Advance Edition
- Static Analysis with Ghidra: Quick Start
- ROM Checker
- FC、SFC、GB等のROMのヘッダや不良ROMの確認が可能。
FC
- NES 6502逆アセンブラ - オールドゲーム ROM研究
- 逆アセンブルツール。
SFC
- SMC(SFC/SNES)ヘッダの付加・削除システム - エミュレータ情報局
- ネットにある解析データと照らし合わせる時やパッチを当てる時にはROMのヘッダの有無をその人に合わせる必要がある。自分から公開するときにも調べて載せておくこと。
- Geiger's Snes9x Debugger
- 一番更新されているエミュSnes9xを解析用に特化させたもの。ゲーム実行をしながらの解析が可能。
- 起動できない場合は、release notes.htmlにあるランタイムのインストールが必要。
- no$sns
- デバッガーが付いたエミュ
- DiztinGUIsh
- 逆アセンブルツール。エミュを使いコード部分とグラ・音楽等の非コード部分の仕分けをすることが可能。
- DisPel
- 逆アセンブルツール。
- SNES 65816逆アセンブラ - オールドゲーム ROM研究
- 逆アセンブルツール。
- Lunar Expand
- ROM拡張ツール。改造する時用。
- Lunar Address
- バイナリエディタ上で見れるアドレスとメモリ上のROMのアドレスを変換できる。
- ROMの種類がわからない時は「Auto-Detect Type」で選択すればOK。
GB
- TGB_Dual_Kai
- TGB_Dualにデバッガ機能を追加したエミュ。
- GB Z80C逆アセンブラ - オールドゲーム ROM研究
- 逆アセンブルツール。
N64
- N64 Map File for ps2dis – ねこかぶのblog 2(仮)
- ps2disに64の各種レジスタ名称が表示されるようにするマップファイル。
GBA
- Disarm
- 逆アセンブルツール。GBAに特化したVerもある。
GC
- Cuyler36/Ghidra-GameCube-Loader: A Nintendo GameCube binary loader for Ghidra
- Ghidra用のプラグイン。Wiiでも使える。
NDS
- DeSmuME(beta版)
- beta版だとdisassemblerやmemory viewerにbreakpoint機能が追加されている。
- ndsdis2
- 逆アセンブルツール。
PS2
- ps2dis
- 逆アセンブルツール。同じMIPSのCPUが使われていて互換性がそこそこあるのでPS1、N64、PSPでも大体使える。