範囲検索
検索のヒント
●概要 プロセスメモリの通常検索・変動検索により、ゲームでの各種フラグやパラメータの格納アドレス等を探し出すことが可能です。特に能力値等各種パラメータはゲーム画面で表示された値を16進数に変換してリトルエンディアン方式にして通常検索を行えば、簡単にその格納アドレスを見つけることが可能なケースも少なくありません。この際、パラメータ格納アドレスが主たる操作用と表示用等の2箇所以上見つかるケースや、環境依存型の変動アドレスであるケースに注意して下さい。後者の場合はアドレスを直接指定する改造コードではなく、ポインタ型改造コードやデバッガ用改造コード等を用いて対処します。 なお、当ソフトウェアでは進数変換とエンディアン変換は自動で行いますので、検索時にこれらの変換を気にする必要はありません。 ●プロセスメモリ上での格納サイズ 例えば1つのパラメータの値が10進数で1000ならば、16進リトルエンディアンでは「E803」となります。この値がプロセスメモリ上で2バイトで格納されているならば「E803」、4バイトで格納されているならば「E8030000」となります。 また、2つの異なるパラメータの値が10進数でそれぞれ100、80となっている場合は、各パラメータの値は16進数で1バイトに収まりますが、プロセスメモリ上ではこれらのパラメータが並んで格納されている場合「6450」、「64005000」、「6400000050000000」と格納サイズが異なるケースがあります。検索時にはこのようなプロセスメモリ上での格納サイズに注意が必要です。 ●単純フラグ ゲームのCGフラグ等各種フラグのアドレスを探し出す場合は変動検索の使用が効果的です。比較単位に注意しながら、フラグのオン・オフを値変動と値不動での絞り込み検索を繰り返して絞り込んで下さい。また、このようなフラグ検索の場合は、最初に出力した比較結果から値01h(オン)または値00h(オフ)での通常検索による絞り込みが有効なケースも少なくありません。なお、単純フラグは必ずしもオンが01h、オフが00hとは限りませんので注意して下さい。 ●ビットフラグ CGフラグがビットフラグ(1バイトの8つのビットそれぞれを使ってCG8枚分のCGフラグオン・オフ情報を格納)の可能性がある場合は、新たなCGフラグを立てた上で値が増加した箇所を変動検索してみて下さい。この場合、さらにCGフラグを立てて、その結果をCGモード上で確認して、新たに立てたCGフラグがその前に立てたCGフラグと近接していると推測される場合は、さらに値が増加した場所を絞り込むと効果的です。また、CGモードの表示内容から、既にオンになっているフラグを推測して、「7FEFFF」といったバイト列で通常検索を行う方法もあります。なお、CG1枚分のフラグのオンを通常は単純フラグのように1バイトを使用して01hで記録し、そのCGに関係する追加CGがある場合は追加フラグのオンを01h→02hで記録させるケースもあります。 ●フラグ検索の効率化1 CGフラグ等が格納されるメモリエリアは、音声オン・オフ等のゲームシステムフラグ格納メモリエリアと同一になることもありますので、ゲームシステムフラグのオン・オフを変動検索で検索してそのアドレスを特定し、そのアドレスが含まれるメモリエリアをメニューの[移動]→「表示アドレスを指定」のメモリマップ表示機能で把握して、そのメモリエリア先頭アドレスとエリアサイズを変動検索の検索・比較開始アドレスと検索・比較範囲サイズに設定して変動検索を行うと効率的に検索できるケースもあります。 ●フラグ検索の効率化2 CGフラグ等が格納されるメモリエリアを簡単に探し出すためには、セーブデータの最初の数バイトをメモリ上で通常検索あるいは、セーブデータの未使用箇所に目印となるバイナリデータを書き込んで、セーブデータを読み込み後に目印用バイナリデータをメモリ上で通常検索を行うというアプローチもあります。ただし、必ずしもセーブデータが読み込まれたメモリエリア上でCGフラグ等を管理するとは限りません。 ●例外的な数値格納方式1 エミュレータでの数値検索においては、プロセスメモリ上に数値が10進数やビッグエンディアン方式で格納されている可能性を考慮してください。また、エミュレータ以外のアプリケーションでも、改造対策としてこのような数値格納方式を使用するケースが想定されます。なお、プログラマからみた検索阻止を目的とした改造対策としては、パラメータ等のビッグエンディアン使用による格納よりも、パラメータ等に対し論理演算やビットシフトを使って暗号化した上で格納する方が実装は容易といえます。 ●例外的な数値格納方式2 一部のエミュレータでは、プロセスメモリ上に数値を3バイトで格納することがあります。この場合は、数値を3バイトの16進リトルエンディアン方式のバイト列に変換したものを検索条件に指定して、3バイト単位で通常検索を行ってください。また、変動検索が上手くいかない場合は[境界ベース]チェックボックスのチェックを外して検索してみてください。 |
●小数の検索 ゲーム等でパラメータの表示値に小数が使用されている場合は、そのパラメータは浮動小数点数でメモリ上に格納されている可能性があります。このようなケースでは、変動検索でのアプローチをお奨めします。その理由は、下記のようにゲーム上で表示されている値を元に検索しても該当しない可能性が高いためです。 小数部分に左右されにくい上位バイトのみを検索する方法もありますが、確実性に問題があります。 ゲーム上で表示されている値:10.5 メモリ上に格納されている値:10.51250000 なお、パラメータの値の表示に小数を用いていても、実際にはメモリ上に格納されている整数値を10分の1にしたものを表示しているといったケースも考えられます。 ●数値検索を用いたプログラムの解析 PCゲームあるいは家庭用ゲーム機のエミュレータでの解析では、プログラムのコード上で設定されているパラメータ等の最大値といった数値を検索することで、簡単にプログラム上のパラメータ等操作処理箇所を特定できるケースもあります。いわゆる「初期設定値」に注目して下さい。パラメータ等操作処理箇所を特定した後は、デバッガや逆アセンブラを使用してコードを書き替えます。なお、初期設定値をデータとしてプロセスメモリ上に展開し、プログラムのコード上ではそのデータのアドレスにアクセスして初期設定値を読み込んでいるケースもあります。 |