はじめに


エグゼハックを行うにはアドレスの特定がかかせません。バイナリエディタやメモリビュアーで数字の羅列を読み取り、何を意味しているのか把握し、自分で書き換える。これが基礎中の基礎であり醍醐味です。
この記事ではそのアドレスを特定していこうと思います。


ちなみにだけど、アドレスと文字列の検索はやり方が違うから注意。 文字列を検索したいならCtrl + F、アドレスをジャンプしたいならCtrl + G(HxDの場合)。

バトルの場合


例を出してみましょう。バトルハックでは、ヒートマンとアクアマンのアドレスを前提に話を進めています。しかし、このアドレスはどのように特定できたのか?

まず、バトルハックを思い出してみてください。 00 64 16 00 FF 00 38 00 D7 98 41 00 36 18 0B 08 という羅列があり、右端の36 18 0B 08がポインタの役割をしていましたね。
つまり、36 18 0B 08という文字列以外はほぼ固定文字列となっています。(ボスバトル16とウイルスバトル15の違いなどもある)
ということは、36 18 0B 08を除いた00 64 16 00 FF 00 38 00 D7 98 41 00という文字列をバイナリエディタで検索をかければヒットするのではないだろうか?
実際にやってみましょう。

...おそらく20パターン前後見つかったのではないでしょうか。見つかった文字列はすべてボスバトルのパターンです。しかし、この中からヒートマンを順番に探していくのはとてもめんどくさいです。
そこで、ポインタ先のことを思い出してください。

ヒートマンの場合、ポインタ先ではF0 00 22 00 00 11 25 03 01 F0という記述がされています。 そのうちの 03 01 これはヒートマンSPを表しています。

つまり、ヒートマンSPの場合だけでなく目的のボスをポインタ先の構成を予測し、検索をかければヒットするのではないだろうか?
(例えばブラストマンRVなら 46 01)

今回の場合、ロックマンとヒートマンSPの1vs1、つまりF0 00 22 00 00 11 25 (03 01) F0という文字列を予測し、検索をかけヒットしたとする。
F0 00 22 00 00 11 25 03 01 F0 の 2番目 00から始まるところがポインタとなっているはずなのでそのアドレスに飛べば元のアドレスにたどり着けるわけです。ポインタ先の始まりのアドレスは(08 0B 18 36)、つまり 36 18 0B 08 という文字列で検索をかけ、ヒットしたのがバトル設定のアドレスというわけです。

1例を書いてみます。
グレイブヤード2の墓石?から出現するブラストマンRVを変更したい。

ブラストマンRVは 46 01 つまり 11 26 46 01がポインタ先設定と予測(11は敵扱い 26は座標)、そして11 26 46 01で検索。

ヒット。 アドレスは000B42FA。 これをバトルセットが始まるF0 00~ の00のアドレスにすると、000B42F6。ポインタ先に記述されているはずなので、並び替える。 F6 42 0B 08、これで検索をかける。(HxDは000B42F6だけどメモリ上は080B42F6とされていることに注意。

ヒット。
000B34E0がグレイブヤードのブラストマンRVの墓石というわけでした。

パレットや細かいゲーム仕様の変更などの場合


TREZにある解説記事からいろんなことを行う場合、だいたい海外ROMが使用されており日本ROMでは書いてあるアドレスが使えません。その場合、海外ROMから予測するのが大前提です。
海外ROMと日本ROMじゃポインタ先がまったく違いますが、ポインタ以外の文字列はほぼ変わりません。なので、海外ROMで該当のアドレスの検索をかける→適当な長さで文字列をとり、日本ROMで検索をかける。→ヒットした場所が目的の場所。

こんな感じです。



コメント欄(ご自由にどうぞ)

名前:
コメント:

すべてのコメントを見る

|