テキストハック会話編


ユーモアセンスで表示される会話テキストの書き換えを例に解説します.
大まかな作業手順は以下の通りです.
  1. テキストデータの先頭アドレスを特定する
  2. 圧縮されたテキストデータを展開,編集してROMの拡張領域にコピーする
  3. ポインタを書き換える

テキストデータのアドレスの特定

ユーモアセンスによって表示される会話のデータがROM内のどこにあるのかを特定します.
このテキストを元にデータを探していきます.
ツールは以下のページのものを使用します.詳細な使用法はリンク先を参照してください.
EXE6_Tools

今回はROMデータをエグゼ6の文字コードでエンコードして平文で検索します.
エンコードにはEXE6TextDumper.pyを使用しています.

いい感じにそれらしい部分が発見できました.
見ての通り文章が圧縮されているので,うまくヒットしない場合は検索語を短くするなど工夫が必要です.

次にこの会話を含むデータの先頭アドレスを特定します.
ヒットした部分から遡っていくとこのようなデータがあります.

@ 0x75adb1 @よりすこし前の部分はユーモアセンスの文ではなさそうです(ここの判断はカンです).
なのでこのアドレスの周辺で圧縮データのヘッダ形式になっている部分を検索します.
ヘッダの検索にはLZ77Util.pyを使用しています.

結果から,0x75adb1に最も近い0x75acbcが圧縮データの先頭アドレスであると判断します.

テキストデータの展開,編集

EXE6Trans.pyを使って圧縮されたテキストデータを展開,編集していきます.
展開したテキストデータをバイナリエディタで開いて先頭4バイト(圧縮フラグとデータサイズ)を削除します(ヘッダが付いていない場合は不要です).
ツールで編集する部分を確認します.
バイナリエディタで全選択してコピーし,バイナリ側に貼り付けてテキストに変換します.

0x7beから0x82f(0x830-0x1)が目的のテキストです.
目的の部分のバイナリをコピーしてツールで編集します.
テキストのフォーマットはツールの詳細やスクリプトのページを参照してください.

元のサイズを超えてしまうと別の部分も書き換える必要があるので今回は超えないように編集します.

編集したテキストをバイナリに変換し元の位置にコピーします.余った部分は0x00で埋めています.
テキストデータ全体をコピーしROMの拡張したスペースにコピーします.今回は0x800000にコピーしています.

ポインタの書き換え

最後に編集したデータを読み込むようにポインタの値を書き換えます.
元のアドレスが0x75acbcなのでROM内をbc ac 75 88で検索します(最後の0x88は圧縮データのポインタであることを示す).

無事1件だけヒットしたのでここの値をデータをコピーした00 00 00 80 08に書き換えます(最後の0x08はROMデータのメモリ上のアドレスを示す).