難解度「AA+」
※このページ全体の難解度です。

アドレス補正属性

環境や対象プロセスによって読み書きすべきアドレスが移動する場合に、その差を補正する属性です。書式は
[adjustment]補正方法,オプション [/adjustment]
です。補正方法は複数あり、それぞれオプションや仕組みが違います。順々に説明していきますね。

search

サーチ補正。読み書きする値と一緒に移動するものの、常に変わらない値がある場合、その「常に変わらない値（バイト列）」を探すことで補正します。書式は
[adjustment]search, 基準アドレス, 固定バイト列, 探査前端, 探査後端, ステップ
です。表記上２行で書いてますが、実際は１行で書いて下さいね。
基準アドレス | 探査を開始するアドレスであるとともに、補正の基準となるアドレスです。固定バイト列が見つかったアドレスと、基準アドレスとの差が補正値になります。
固定バイト列 | 書き換えたい値と同量のアドレス移動を起こし、かつ常に変わらない値を、バイト列として指定します。バイト列の詳細は、《B-バイト列》を参照。
探査前端 | サーチ範囲の最小アドレスを指定します。
探査後端 | サーチ範囲の最大アドレスを指定します。
ステップ | 16バイト単位でメモリを区切ったとき、常に1バイト目に固定バイト列がくると分かっている場合、「1バイト進めて比較して」を繰り返すよりも、「16バイト進めて比較して」を繰り返す方が遙かに効率的です。その比較毎のとび幅を指定します。
当然ながら、固定バイト列はユニークな値（メモリ中では非常に稀な値）でないと、関係のないところでもヒットしてしまいますので、注意してください。 なお、通常は「固定バイト列が見つかったアドレスと、基準アドレスとの差」が補正値になりますが、この差から補正値を選択するという方法もあります。
[adjustment]search, 基準アドレス, 固定バイト列, 探査前端, 探査後端, ステップ, 差=補正値 / 差=補正値 / 差=補正値
このような書き方（1行で書きます）をしますが、ステップのあとに','で区切って、「差=補正値」という形で、必要分だけ'/'で分けて連ねます。このとき該当する差がない場合は、補正値は0になります。 サーチ補正の使用例は、
[adjustment]search, 0x500000, 11FF22CC33, 0x500000, 0x60FFFF, 1 [adjustment]search, 0x800000, CC??CCFF, 0x500000, 0xAFFFFF, 8 [adjustment]search, heap2, 01FF 0100 01FF, heap2, heap3, 1, 0x20=0x40/ 0x30=0x10/ 0x40=0x50
などです。

dialog

ダイアログ補正。基本的にはサーチ補正と同じですが、固定バイト列を「ユーザーの入力から生成」します。 書式は
[adjustment]dialog, 基準アドレス, ADJファイル, 探査前端, 探査後端, ステップ
です。表記上２行で書いてますが、実際は１行で書いて下さいね。
基準アドレス 探査前端 探査後端 ステップ | サーチ補正に準じます。
ADJファイル | サーチするバイト列を規定するための、ユーザーの入力方法を記述したADJファイルを指定します。（ADJファイルについては後述します。）ファイル指定の詳細は、《C-ファイル指定》を参照。
さて、サーチ補正でいうところのバイト列を、ADJファイルではどのように記述していくのか、順を追って説明します。 ADJファイルには、スクリプトと同様にいくつかの命令があります。まずはその命令の解説から行きましょう。
命令種別 | ※　説明　※
[val] | サーチするバイト列を記述します。ただし、この場合に限り"*."という置き換え記号を用いることができます。置き換え記号に関しては後述します。
[val]*.*.*.
[input] | 値入力用のコントールを作成します。
[input]名称:項目種別, 未入力の可否, オプション
「未入力の可否」以外のオプションは、項目種別に準じます。「未入力の可否」には、 ok か no を指定します。 ok を指定した場合、値が未入力でもサーチを行います。その際、入力値は必要バイト分のスキップ処理に置き換わります。 利用可能な項目種別の詳細は、後述します。
[note] | [note]〜[/note]までの間に、注釈を記述できます。[note]の後ろには wordwrap オプションをつけて自動で折り返すこともできます。
[note]wordwrap ステータス画面に入ってから、入力してください [/note]
[val]は基本的にバイト列ですし、他の命令も類似の項目に準じていますので、そこまで難しくはないと思います。 続けて、[input]命令の項目種別を見ていきます。

[input]命令

[input]で始まる値入力命令は、[subject]と非常に似た構文を取ります。項目種別ごとのオプションと実例を、以下に示します。
命令種別 | ※　説明　※
calc | 数値入力用のエディットボックスを作成します。
[input]名称:calc, 未入力の可否, 最小値, 最大値, 符号の有無, エンディアン
「未入力の可否」以外のオプションは、電卓項目に準じます。表示は、 名称： といった感じになります。
toggle | 選択用のラジオグループを作成します。
[input]見出し, ONの名称, OFFの名称:toggle, 未入力の可否, ONのバイト列, OFFのバイト列
「未入力の可否」以外のオプションは、トグル項目に準じます。表示は、 未入力の可否が no ならば
見出し ONの名称OFFの名称
といった感じになり、 ok ならば
見出し ONの名称OFFの名称不明
のようになります。
string | 文字列入力用のエディットボックスを作成します。
[input]名称:string, 未入力の可否, 最大文字数, 末尾にNULL付加
「未入力の可否」以外のオプションは、文字列項目に準じます。表示は、 名称： といった感じになります。
list | 一覧選択用のコンボボックスを作成します。
[input]名称:list, 未入力の可否, リストファイル, 初項, 公差
「未入力の可否」以外のオプションは、リスト項目に準じます。表示は、 名称： といった感じになります。
これらの命令を使って、サーチするバイト列を作ります。先ほど「後述する」と書いた置き換え記号(*.)ですが、これは、[val]と[note]（[/note]）以外の[input]命令の入力値と置き換えられる特殊な記号です。例を挙げましょう。
[input]体力:calc,no,0,0xFFFF [val]FF*.FF
上記のようなADJファイルで、「体力」に500を指定したとします。500は16進数で01F4、この項目は2バイト使用する（範囲が0〜0xFFFF）ので、リトルエンディアンに変換するとF401。サーチに使うバイト列は、「FF F401 FF」となります。 なんとなく察しが付いたでしょうか？なお、選択できる項目の数と「置き換え記号(*.)」の数は一致しなくてはなりません。 このようにして作られたバイト列をサーチし、見つかったアドレスと基準アドレスの差が補正値になります。

heap

ヒープ補正。メモリの搭載量等の環境によって、ヒープ領域の範囲に差が出てくることがあります。このとき、「ヒープnの開始アドレスから、Xバイトの位置に値を格納」といった形でメモリを使用するソフトの場合、読み書きは特定のアドレスではなく、「ヒープnの開始アドレス」からの相対アドレスに補正する必要があります。 書式は
[adjustment]heap, heap番号=開始アドレス>終端アドレス
です。必要分だけ、','で区切って連ねます。用例も併せて見てください。
[adjustment]heap, heap2=0x600000>0x7FFFFF [adjustment]heap, heap2=0x500000>0x6FFFFF, heap3=0x700000>0x9FFFFF
このようにしてヒープ範囲を定義しておくと、読み書きするアドレスが定義済みのヒープに属しているならば、実行環境のヒープ範囲と照らし合わせ、自動的に補正をかけます。（定義範囲に含まれないならば、そのままのアドレスを使います。）なお、ヒープ番号は1からはじまります。

crc

CRC補正。ファイル内容を、計算式によって32ビットの数値に変換したものがCRCです。1バイトでも内容が違うと異なる値になることから、データの正当性を示す指標として使われています。 　書式は
[adjustment]crc, CRC=補正値
です。必要分だけ、','で区切って連ねます。用例としては
[adjustment]crc, 0015D02C=0x1F00 [adjustment]crc, CC52F099=0x20, DE7716F2=0x60
のようになります。指定プロセスの32ビットCRCが、定義したCRCと一致した場合、'='で連結された補正値を、読み書きするアドレスに加算します。もし定義したCRCのどれとも一致しなければ、補正値は0になります。

ねくすと　せくしょん⇒
≪せくしょん　ばっく