注記 | |
---|---|
本節は特に陳腐化してはいないのだが、補足しておく:
|
ここでは逆アセンブラーツールをごく簡単に紹介する。 逆アセンブラーのプログラミングは CPU の仕様書があれば可能であるため、 既に気合いの入ったマニアの手により、いくつかの逆アセンブルツールが開発・配布されている。 後発の解析人としては、そのツールを再利用するのがよい。
注意 | |
---|---|
本書のダンプコードおよび本セクションの記述は、
いずれもバージョン 0.99 の DisPel に準拠している。
DisPel の最新版のソースコードが下記のサイトから入手可能だが、
ニーモニックが小文字で出力されるように変更されていたり、
|
65816/SMC 逆アセンブラー。 DisPel はコンソールアプリである。 すなわち、ROM イメージファイルを引数にとり、 アセンブリーコードをテキスト形式で出力するプログラムである。 アセンブリーと聞いても何のことやらさっぱりだというのであれば、計算機の基礎知識から勉強するハメになる。
解析道の先人は、外国のサイトから 65816 に関する文書を検索して、 言語仕様を把握してから解析に着手したという――。
DisPel の特徴は以下のとおり。
アドレス指定による逆アセンブル範囲の指定。バンク丸ごとも可能
REP/SEP 命令を意識した逆アセンブル
バンク境界の適切な処理
自動で HiROM/LoROM を判断する
「本物」の SNES アドレッシング
DisPel を逆アセンブラーとして使うことを決めたならば、
環境変数 PATH
に含まれている適当なフォルダに実行ファイル DisPel.exe
を移動することになる。
ここまではエクスプローラで簡単にできる。
しかし、コードの出力をするにはコマンドプロンプトウィンドウを開く必要がある。
ただし Windows の cmd では逆アセンブリー処理以降のことが何もできないので 2.3 Cygwin で説明する環境で作業する。
それを開いたら、SFC 版ドラクエ 3 の ROM イメージファイル(ここでは sfcdq3.smc
とする)のあるフォルダに移動して、
例えば以下のように入力すると、バンク $C3 の逆アセンブリーコードを得ることになる。
ちなみに実際はこの領域はプログラムではなく、ウィンドウ関連のデータ定義域なので、以下の出力は無意味だ。
$
dispel -n -h -s -b C3 -p sfcdq3.smc
C3/0000: 2184 AND ($84,X) C3/0002: 50C0 BVC $FFC4 C3/0004: 200000 JSR $0000 C3/0007: 0000 BRK #$00 C3/0009: 5562 EOR $62,X C3/000B: 00AA BRK #$AA C3/000D: B052 BCS $0061 C3/000F: 8020 BRA $0031 C3/0011: 0000 BRK #$00 C3/0013: 0000 BRK #$00 …
上記の例では DisPel の自動判定機能に頼らず、明示的にオプションを指示した。
SFC 版ドラクエ 3 と SFC 版ドラクエ 6 はメモリーマッピングが同じ (HiROM, FastROM) である。
ともに -h -s
オプションを指定すればよい。
SFC 版ドラクエ 5 の場合は LoROM, SlowROM であるため、代わりに -l -i
を利用する。
あるアドレスからの逆アセンブリーコードを得たい場合は、
オプション -r
で SNES アドレス値を指定することに加え、
プログラムとしてのその地点における MX レジスターフラグの状態を加味してやらねばらない。
M レジスタービットが立っている場合、オプション -a
を、
X レジスタービットが立っている場合、オプション -x
を与える必要がある。