範囲検索(64Bit Mode)
検索のヒント
●概要 プロセスメモリの通常検索・変動検索により、ゲームでの各種フラグやパラメータの格納アドレス等を探し出すことが可能です。特に能力値等各種パラメータはゲーム画面で表示された値を16進数に変換してリトルエンディアン方式にして通常検索を行えば、簡単にその格納アドレスを見つけることが可能なケースも少なくありません。この際、パラメータ格納アドレスが主たる操作用と表示用等の2箇所以上見つかるケースや、環境依存型の変動アドレスであるケースに注意して下さい。後者の場合はアドレスを直接指定する改造コードではなく、ポインタ型改造コードやデバッガ用改造コード等を用いて対処します。 なお、当ソフトウェアでは進数変換とエンディアン変換は自動で行いますので、検索時にこれらの変換を気にする必要はありません。当検索機能での検索対象の数値入力は「0x」をつけることで16進入力が可能です。 ●メモリエリアのアクセス属性 ゲームのパラメータやCGフラグ等各種フラグの格納アドレスは、その内容が変動する以上、アクセス属性に読み書き可能を意味する[ReadWrite]が設定されている必要があります。そのため、パラメータやフラグの検索対象メモリエリアを[Commit-ReadWrite]に特定すれば、従来の検索処理と比較して大幅に検索処理の効率化を図ることが可能になります。 ●プロセスメモリ上での格納サイズ 例えば1つのパラメータの値が10進数で1000ならば、16進リトルエンディアンでは「E803」となります。この値がプロセスメモリ上で2バイトで格納されているならば「E803」、4バイトで格納されているならば「E8030000」となります。 また、2つの異なるパラメータの値が10進数でそれぞれ100、80となっている場合は、各パラメータの値は16進数で1バイトに収まりますが、プロセスメモリ上ではこれらのパラメータが並んで格納されている場合「6450」、「64005000」、「6400000050000000」と格納サイズが異なるケースがあります。検索時にはこのようなプロセスメモリ上での格納サイズに注意が必要です。32ビット版のゲームで、パラメータやフラグ等の格納に8バイト(QWord)が使われることは少ないといえます。 ●単純フラグ ゲームの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バイト単位で通常検索を行ってください。また、変動検索が上手くいかない場合は[境界ベース]チェックボックスのチェックを外して検索してみてください。 ●例外的な数値格納方式3 FLASHのゲームでは、数値格納にDoubleを使用しているケースがあり、しかも目的の数値データが必ずしもQWORD境界上にあるとは限りません。さらに最新のFlash Playerではデータの改ざん対策が施されているため、解析環境としてはVer7以前の古いバージョンのFlash Playerが推奨されています。 |
●小数の検索 ゲーム等でパラメータの表示値に小数が使用されている場合は、そのパラメータは浮動小数点数でメモリ上に格納されている可能性があります。このようなケースでは、数値範囲を「表示値-1から表示値+1」などに指定して検索か、変動検索でのアプローチをお奨めします。その理由は、下記のようにゲーム上で表示されている値を元に検索しても該当しない可能性が高いためです。 小数部分に左右されにくい上位バイトのみを検索する方法もありますが、確実性に問題があります。 ゲーム上で表示されている値:10.5 メモリ上に格納されている値:10.51250000 なお、パラメータの値の表示に小数を用いていても、実際にはメモリ上に格納されている整数値を10分の1にしたものを表示しているといったケースも考えられます。 ●ポインタの検索 ゲーム等のパラメータ格納アドレスなどで、環境依存型変動アドレスの場合に、改造コードでそのアドレスを指定するためのポインタを見つけるには、以下のアプローチがあります。 ・デバッガで対象アドレスに読み書きのブレークポイントを設定してブレークさせ、対象アドレスへ読み書きを行ったプログラムコードを観察して、ポインタがどのように設定されているかを確認します。必要に応じて、パラサイトルーチンを組んで、そのポインタをメインモジュールのデータセクションといった固定アドレスにコピーし、コピーしたポインタを使うことで改造コード作成を簡易化させます。 ・対象アドレスが格納されたメモリエリアを、メニューの[移動]→[表示アドレスを指定]で確認します。そのメモリエリア内で、あるいは対象プロセスのメインモジュールのデータセクション内で、対象アドレスに近い数値を格納したアドレスを、対象アドレス±0x1000程度で数値範囲を指定して通常検索で検索します。また、対象アドレスをバイト列とみなして、下2~4ケタをワイルドカード"?"にして検索してみるという方法もあります。 ●数値検索を用いたプログラムの解析 PCゲームあるいは家庭用ゲーム機のエミュレータでの解析では、プログラムのコード上で設定されているパラメータ等の最大値といった数値を検索することで、簡単にプログラム上のパラメータ等操作処理箇所を特定できるケースもあります。いわゆる「初期設定値」に注目して下さい。パラメータ等操作処理箇所を特定した後は、デバッガや逆アセンブラを使用してコードを書き替えます。なお、初期設定値をデータとしてプロセスメモリ上に展開し、プログラムのコード上ではそのデータのアドレスにアクセスして初期設定値を読み込んでいるケースもあります。 |