【雑文】ゲーム改造、サーチ機能、ブレイクポイント

■ざっくり解説
ゲーム改造ツールの内部動作 そしてブレイクポイント

■ワンポイント
・エミュレーターでチートサーチするならFCEUXで探そう
・デバッグで追うならMesenが強力(ステップ実行でアンドゥができる)
 ただMusenにはチートコードを検索する機能がない

★残機数で考えてみる

ゲームの残機はだいたい決まった場所(メモリアドレス)に格納されている
改造ツールのサーチ機能とはその場所を探す機能である

mario-dbg1.jpg
※FCEUXのRAMSerch機能
(Search ボタンを押した時点で前回押した時点から値が変わった(減った)メモリの値の一覧を表示する)

ペナルティで残機が1機減る
①3機だったのが②2機になったりする
だからツールの検索機能で
①のタイミングで3、②のタイミングで2になっている場所(アドレス※)を探す
複数見つかっても、そういった事を繰り返せば、その場所が特定できる

★残機が減らなくなるわけ
そうしてわかった場所を任意の値、1にすると設定すれば
改造ツールはえんえんとその場所を1にするように動作する
例えばペナルティで1機減った瞬間0になるが、また1になるのである
=瞬間1以外の値になることはあるが次の瞬間また1になるのである
これが改造ツールの動作である

★ブレイクポイント(という機能)
開発ツール(エミュレーター)にはブレイクポイントという機能が備わっているものがある
どういう機能かというと、その場所(メモリアドレス)を指定して監視
値を見に行ったり、書き換えたりしようとするとそこでプログラムを停止させる仕組みである

super-mario-dec.jpg
※Mesenのデバッグ機能
(残機アドレスを書き換えようとする直前にゲームが停止そのプログラム位置を示す)

ここでプログラムを読める能力は必要となるのだが
ペナルティで残機が1機減る場所なら、1減らす処理が書かれている
(DEC デクリメント・・・1引き算する命令)
この処理をなくす(何もしない処理にする)と残機が減らなくなる
ファミコン等の8ビット機の命令は高級言語に比べるととても少ない。眺めてみるのも一興

余談だがスクリプト・ベーシック等でも変数を監視してプレイクポイントを設定できるものがある

★プログラム改造
改造コード(監視するアドレスと設定する値)がわかれば、その値を書き換えるプログラムをいじる
これがツール不要になる改造である

※アドレス、メモリアドレス
ベーシックや、高級言語だと変数に値を格納するが
CPUが直接解釈・実行できる命令のアセンブラ・機械語でプログラムを作る場合
ゲームを作るときにメモリのここは残機、ここは面数等アドレスを決める手法をとる

※デバッガ デバッグ機能
プログラムを表示、命令を1つづつ実行したりする機能がありそのツールを指す

※何もしない処理
機械語のプログラムを削ってプログラムのアドレスをずらすと正常に動作しなくなることがあるため
何もしない命令=NOPという命令で置き換える

■参考
ファミコンチート集 Wiki FCEUX チートコードサーチ解説

ファミコンチート集 Wiki チートコード

NES研究室 アセンブラ命令一覧ほか

この記事へのコメント