改造コード 書式と使用例
改造コード目次
●対応コードについて●基本コード
●連続型・等差級数型・断続型改造コード
●算術演算型改造コード
●論理演算型改造コード
●アドレス間演算型改造コード
●ダンプ型・アップロード型改造コード
●条件分岐型改造コード
●コピー型改造コード
●キャンセル型改造コード
●ポインタ型改造コード
●アクセス属性変更型改造コード
対応コードについて
フルスクリーンのゲーム等に用いるプロセス指定コード(PROC:)と、使用頻度が少ないスクリプトファイル読み込みコード(#)は、今後の機能追加との兼ね合いで対応を保留しています。 新型32ビット版(UsaMimi32.exe)と64ビット版(UsaMimi64.exe)では、基本コードと連続型・等差級数型・断続型およびそれらのポインタ型、そしてキャンセル型の改造コードに対応しています。これ以外の改造コードを用いる複雑な処理は、プラグインを自作した方が記述もメンテナンスも容易なため、対応を見送りました。なお、現在では、「Visual Studio Community」など無償で高機能なコンパイラが配布されており、うさみみハリケーン作者のWebサイトで配布しているプラグインのサンプルのソースコードを雛形にすれば、簡単にプラグインを製作可能です。C++言語等による32/64ビット版プラグインの製作経験は、プログラミング・プログラム解析のスキル向上はもとより、独自のプログラム解析ツールを製作する上でも役立ちます。当ソフトウェア専用の改造コードの使用だけではなく、より柔軟で高度なアプローチを可能にする、プラグインを製作されてみることをお勧めします。 |
基本コード
■書式;コメント →行頭の「;」から改行までをコメントとして無視します →コメントは独立した行として記述して下さい 450000-0F27 →アドレス450000から2バイトをバイト列「0F27」で書き換えます 450000$うさぴょん →アドレス450000から10バイトを文字列「うさぴょん」に対応するバイナリデータで書き換えます →「$」でANSI文字列、「!」でUnicode文字列として書き換え、「!」は新型32ビット版(UsaMimi32.exe)と64ビット版のみ対応 |
■注意事項
コメントは他のコードの直後に改行なしで記述することはできません。例えば「450000-0F27;Money」といった使い方には対応していません。 文字列型コード使用時は、必要に応じて書き込む文字列対応バイナリデータの終端に値00h(Unicodeなら0000h)を追加して下さい。この場合、ダンプ表示ウィンドウで文字列対応バイナリデータの書き込み結果を表示させれば、文字列終端アドレスが簡単に確認できますので、その次のアドレスに値00hを書き込むコードを追加します。 |
連続型・等差級数型・断続型改造コード
■書式450000>4500FF-01000000 →アドレス450000から4500FFまでを「01000000」の連続で書き換えます 450000>4500FF-050003FF{02 →「050003FF」(値FF030005h)に値02hを加算しながら連続で書き換えます 450000>4500FF-FFFFFF000500E703}30 →アドレス450000を起点として、30hごとに「FFFFFF000500E703」を書き込みます 「{」ではなく「}」ですので注意して下さい |
■等差級数型コード実行例
指定した書き換え内容の先頭4バイトをダブルワードの値とみなして、指定した等差を加算していきます。
ゲームの改造では複数アイテム情報の一括書き換え等に使用します。 450000>4500FF-0100FFFF{02 →書き換え結果は「0100FFFF 0300FFFF 0500FFFF...」 450000>4500FF-01{01 →書き換え結果は「01020304 05060708 090A0B0C...」 450000>4500FF-00000303FFFF0000{10 →書き換え結果は「00000303 FFFF0000 10000303 FFFF0000 20000303 FFFF0000...」 |
■注意事項
連続型コードや等差級数型コードでは、指定範囲サイズが書き換え内容として指定したバイナリデータのバイト数の倍数でない場合、指定範囲内で安全と考えられる上限まで書き換えます(範囲指定ミスの可能性があるため)。 |
算術演算型改造コード
■書式450000-03E7+ →アドレス450000以降の4バイトをダブルワードの値とみなして「03E7h」を加算 450000-FFFFFC19+ →アドレス450000以降の4バイトをダブルワードの値とみなして「03E7h」を減算(符号付き整数) 450000-03E7- →アドレス450000以降の4バイトをダブルワードの値とみなして「03E7h」を減算 450000-64* →アドレス450000以降の4バイトをダブルワードの値とみなして「64h」で乗算 450000-64/ →アドレス450000以降の4バイトをダブルワードの値とみなして「64h」で除算し商で書き換え |
■注意事項
算術演算型コードでは値をダブルワードとして扱います。また、演算に使用する数値は16進数のビッグエンディアンで指定します。算術演算型コードを使用した結果、桁あふれ等でダブルワードの範囲を超えた場合は、その超過分を無視します。 なお、和と差を扱う場合は符号付き整数、積と商を扱う場合は符号なし整数で演算を行うようにしました。ただし、論理演算型改造コードで「2の補数」を演算することで正負符号の反転も可能です。また、値00hでの除算は無視します。 乗算あるいは除算で、かつ演算対象の値がダブルワードでない場合の対処は、アドレス間演算型改造コードの使用例を参考にして下さい。 |
論理演算型改造コード
■書式450000-00F477CFo →アドレス450000以降の4バイトをダブルワードの値とみなして「00F477CFh」でOR処理 450000-0F0FFF7F& →アドレス450000以降の4バイトをダブルワードの値とみなして「0F0FFF7Fh」でAND処理 450000-FEFFFF7Fx →アドレス450000以降の4バイトをダブルワードの値とみなして「FEFFFF7Fh」でXOR処理 450000-7Fx →アドレス450000以降の1バイトをバイトの値とみなして「7Fh」でXOR処理 450000-FFFFFFFFx 450000-01+ →この2つのコードを組み合わせてアドレス450000のダブルワード値の正負符号を反転させます(「2の補数」といいます) |
■ビットフラグ操作例
00463000-24o →アドレス463000のバイトでビット5とビット2のビットフラグをセット 00463000-80000004o →アドレス463000のダブルワードでビット31とビット2のビットフラグをセット 00463000-FFFFFFDB& →アドレス463000のバイトでビット5とビット2のビットフラグをクリア →AND処理では対象がバイトでもダブルワード単位で演算する必要があることに注意して下さい 00463000-7FFFFFFB& →アドレス463000のダブルワードでビット31とビット2のビットフラグをクリア 00463000-24x →アドレス463000のバイトでビット5とビット2のビットフラグを反転 00463000-80000004x →アドレス463000のダブルワードでビット31とビット2のビットフラグを反転 |
■注意事項
論理演算型コードでのOR処理及びXOR処理は主にビットフラグ操作用で、AND処理は主にビットマスク用です。演算に用いる数値は16進のビッグエンディアンで指定しますが、演算対象となる値や演算後の値はリトルエンディアン方式で格納されることに注意が必要です。なお、値FFh(FFFFh、FFFFFFFFh)でのXOR処理でビット反転を行うことができます。ビットフラグの操作にあたっては、まず2進ビットパターンを覚えてください。 |
アドレス間演算型改造コード
■書式450000-451000[+ →アドレス450000以降の4バイトと451000以降の4バイトをそれぞれダブルワードの値とみなして、前者に後者の値を加算 →演算に用いる値が4バイトのダブルワードで無い場合の対処は使用例を参照してください |
■ダブルワード以外の数値での使用例
アドレス間演算に用いる値がダブルワードではない場合は、必要に応じて演算に不要なアドレスのバイナリデータをダンプ型改造コードを使用して一時退避させます ◆アドレス463000以降の2バイトとアドレス463500の1バイトでの演算例 00463002<c:\dump1.dat>02 00463002-0000 00463501<c:\dump2.dat>03 00463501-000000 00463000-00463500[* 00463002<c:\dump1.dat 00463501<c:\dump2.dat または、セクションの空き領域該当箇所等の、プロセスメモリ上の未使用領域に値をコピーして演算します ◆プロセスメモリ上の未使用領域使用例 00463000<c:\dump1.dat>02 00500000<c:\dump1.dat 00463500<c:\dump2.dat>01 00500004<c:\dump2.dat 00500000-00500004[* 00500000<c:\dump1.dat>02 00463000<c:\dump1.dat →アドレス500000はプロセスメモリ上の未使用領域 →ポインタ型改造コード併用でなければ、ダンプ型改造コード以外にコピー型改造コードでも対処可能 ◆ポインタ型改造コードとの併用例 *463000>1000<c:\dump1.dat>04 00500000<c:\dump1.dat 00500000-02* *463000>1008-500000[+ →アドレス500000はプロセスメモリ上の未使用領域 |
■注意事項
アドレス間演算型改造コードは、上記算術演算型改造コードおよび論理演算型改造コード総てに適用可能です。 |
ダンプ型・アップロード型改造コード
■書式450000<dump.dat>70 →アドレス450000から70hバイトをファイル名「dump.dat」で当ソフトウェア実行ファイルがあるフォルダにダンプ 450000<c:\dump.dat>70 →アドレス450000から70hバイトをファイル名「dump.dat」でパス「c:\dump.dat」にダンプ →ダンプ先パス及びダンプファイル名は自由に指定可能で、制限はありません 450000<c:\dump.dat →アドレス450000以降にファイル「dump.dat」のバイナリデータをサイズ分書き込み 450000<c:\dump.dat<20 →アドレス450000以降にファイル「dump.dat」のバイナリデータを先頭から20hバイト分書き込み |
■使用例
ゲームの改造で複数キャラクターのステータス(LEVEL、攻撃力、HP、その他フラグ)等を書き換えるケース等に有用です。 最初に一人のステータスを書き換えて雛型を作成します。 450000-FF 450004-E703 450008-E703 45000C-FFFF 450010-FFFF 450014-03 これをダンプあるいはプロセスメモリ上の未使用領域に雛型としてコピーします。 450000<c:\dump.dat>15 他のキャラクターのステータス格納アドレスにアップロードあるいはコピーして書き換えます。 450100<c:\dump.dat 450200<c:\dump.dat 450300<c:\dump.dat コピー型改造コードを使用して、最初に書き換えたキャラクターのステータスを直接コピーする方法もあります。 %450000>450500-15 |
■注意事項
ダンプ時に指定したファイルが既にある場合は、既存のファイルは上書きされます。 |
条件分岐型改造コード
■書式450000=<S64 →アドレス450000のバイトの値が64hより小なら次のコードから実行 →条件に適合しないなら、次の次のコードから実行 450000==M270F →アドレス450000のワードの値が270Fhなら次のコードから実行 →条件に適合しないなら、次の次のコードから実行 450000=>L01869F →アドレス450000のダブルワードの値が01869Fhより大なら次のコードから実行 →条件に適合しないなら、次の次のコードから実行 450000=!L270F →アドレス450000のダブルワードの値が270Fhでなければ次のコードから実行 →条件に適合しないなら、次の次のコードから実行 450000-00+ 450000-FFFFFFFF& ;コメント →条件適合時または条件不適合時用ダミーコード(プロセスメモリを変化させない) |
■使用例
フラグ状況に応じて特定パラメータの値を変更あるいはそのままの状態で別のパラーメータにコピー 00463070=>S07 00463100-64 00463070==S00 00463100-32 ;本当はなくてもよいが処理をわかりやすくするため追加したコード 00463070=<S08 ;同上、条件適合時になにもしない例 00463100-00+ ;最終的にパラメータの値をコピー %00463100>463104-01 |
■注意事項
条件分岐型改造コードの使用は、複数コードの一括実行が前提となります。また、条件分岐する以上、指定条件適合時と不適合時の両方の処理が存在することを想定しています。そのため、条件分岐型改造コードの後に、2つ以上のコードがなければ警告します。もちろん、条件不適合とは関係ない別のコードでも、指定条件適合時コードの次にあれば条件不適合時のコードとみなして警告は行いません。 条件適合時あるいは条件不適合時のコードが一切不要な場合は、コードとして意味をなさないコメント、値00h加算や値FFFFFFFFhでのAND処理コード等をダミーコードとして追加して下さい。 条件分岐型改造コードの条件判定は符号なしの値として行います。なお、条件分岐型改造コードの書式はC言語を参考にしています。 条件分岐型改造コードの条件判定用数値のサイズは、必ず半角大文字記号「S,M,L」で指定して下さい。 |
コピー型改造コード
■書式%450000>450100-08 →アドレス450000から8hバイトのバイナリデータをアドレス450100以降にコピー |
■注意事項
コピー型改造コードは、目的のアドレスに格納された値を一旦別の場所に退避させる用途で用いることも可能です。コピー先の値をバックアップとして、コピー元の目的のアドレスに格納された値に対し、算術演算や、AND処理によるビットマスク等を施し、更に条件分岐判定させた上で、必要に応じてバックアップから値を書き戻すこと等に使用できます。もちろん、上に挙げた例に限らず、広範囲のバイナリデータのバックアップや複数箇所にコピーするための雛型作成等にもコピー型改造コードは有用です。 なお、このような一時退避用コピー先には、メモリ上にプログラムの本体が展開された(厳密には異なる)モジュールエリア内各セクションの空き領域を指定するのが適切です。 コピー範囲が広範囲かつ退避用途で空き領域が見つからない場合は、ダンプ型改造コード及びアップロード型改造コードの使用がお奨めです。 |
キャンセル型改造コード
■書式450000=>L01869F Quit 450000-9F860100 →条件分岐型改造コード他複数コード実行時に使用します。「Quit」で以降のコード実行をキャンセルします。 |
ポインタ型改造コード
■概要開始アドレスを「*ポインタアドレス>アドレス補正用数値(負の値可、16進数)」に置き換えてください。ポインタ指定は上記のコードすべてに適用可能です。 連続型改造コードとコピー型改造コードはその性格上書式が変更されます。 |
■書式
*450000>0100-0F27 →ポインタアドレス450000のダブルワードの値に100h加算した値を開始アドレスとして書き換え *450000>0100>50-01000000 →ポインタ使用時の連続型改造コード。開始アドレスから50hバイトを「01000000」の連続で書き換え。等差級数型改造コードも同様です。 →開始アドレスは、ポインタアドレス450000のダブルワードの値に100h加算した値です。 *%450000>0100>20-10 →ポインタ使用時のコピー型改造コード。コピー元アドレスから20hバイト先に10hバイト分をコピー →コピー元アドレスは、ポインタアドレス450000のダブルワードの値に100h加算した値です。 *%450000>FFFFFFE0>FFFFFFE0-10 →アドレス補正用数値とコピー先アドレス指定に負の値を指定したケース →コピー元アドレスは、ポインタアドレス450000のダブルワードの値から20h減算した値です。 →コピー先アドレスは、コピー元アドレスから20h減算した値です。 *%450000>4000>012000-04 →ポインタアドレス450000のダブルワードの値が982000hで目的のアドレスがその4000h先にある場合 →アドレス986000のダブルワード(4h)の値をアドレス998000にコピー |
■ゲーム等の多重ポインタ対処例
*450000>20/01A0/4000/0280/0280-E703 →アドレス450000のダブルワードの値に20h加算した値を次のポインタのアドレスとし、そのポインタアドレスのダブルワードの値に01A0hを加算してさらに次のポインタ...というように繰り返します。 |
アクセス属性変更型改造コード
■書式A00401000S00005000 →アドレス401000を先頭とするサイズ5000hのメモリエリアを指定して読み書き実行可能にします |
■注意事項
アドレスとサイズは4バイトでの入力必須で、アドレスは必ず指定メモリエリア先頭、サイズは必ず指定メモリエリアのサイズ以下にして下さい。メモリエリアのアクセス属性変更は、Windowsの仕様により0x1000単位で行われるため、なるべく指定メモリエリアの先頭アドレスとサイズを0x1000の倍数で指定して下さい。メモリエリアの詳細については、メニューの[移動]→[表示アドレスを指定]でメモリエリアマップを表示して確認してください。 |