プロセスメモリエディタ「MHS」を利用したメモリ監視・操作
MHSはいわゆるプロセスメモリエディタと呼ばれるもので、ゲームの見えないパラメータを表示させたり、値を書き換えたりすることができます。類似のツールはほかにもありますが、TAS界隈ではよくこのMHSが利用されます*1。
日本では同様のツールとして、うさみみハリケーンなどが知られています。噂に聞くところでは検索機能はこちらの方が高度とも聞きますし、可能であれば他のプロセスメモリエディタ、デバッガと組み合わせて利用すると、できることの幅は広がるでしょう。個人的にはMHSの基本のシンプルさがとても好きです。
それでは、導入から簡単な利用までを見てみましょう。
起動〜対象プロセス選択
メモリ監視対象のプログラム(ゲーム)を起動した状態で MHS.exe を起動します。初回起動時には下記のダイアログが表示されます。
Would you like to personalize this software?
Doing this can allow you to avoid detection by anti-cheat software.
If you do not want to do this now, you can always do it later from the Tools/Modify Self menu. (はい/いいえ)
「不正防止つきソフトウェアへの対策として、MHSを改変しますか?」というような内容です。TAS目的の方にはまず不要ですし、Tools/Modify Self メニューから後で改変を実施することもできますので、ここでは「いいえ」を選択して次へ進みます。
メインウィンドウが表示されたら、メニューから File → Open Process を開きます。
現在起動中のプロセスを一覧表示したダイアログが開くので、タイトルや実行ファイル名を参考に、メモリ監視対象のプロセスを選択して、OKを押してください。
これで、MHS でメモリにアクセスする準備ができました。
メモリアドレスを検索する
メモリアドレスを検索するには、Found Addresses ウィンドウにある、虫眼鏡(単一)アイコンのボタンをクリックします(あるいはメニューから Search → Data-Type Search を選択)。
すると、検索のための Data-Type Search ダイアログが表示されます。
まずは、Search グループで基本的な検索条件を指定します。選択肢の意味は下記の表のとおりです。
Data Type | バイト数 | 値の型・範囲 |
---|---|---|
Byte | 1 | 0〜255 の整数 |
Char | 1 | -128〜-127 の整数 |
Short | 2 | -32768〜-32767 の整数 |
Unsigned Short | 2 | 0〜65535 の整数 |
Long | 4 | -2147483648〜-2147483647 の整数 |
Unsigned Long | 4 | 0〜4294967295 の整数 |
64-bit Integer | 8 | -9223372036854775808〜9223372036854775807 の整数 |
Unsigned 64-bit Integer | 8 | 0〜18446744073709551615 の整数 |
Float | 4 | 実数 (単精度浮動小数点数) |
Double | 8 | 実数 (倍精度浮動小数点数) |
Evalutation Type | 説明 |
---|---|
Exact Value | Value to Find に一致する値を検索する。 |
Not Equal To | Value to Find に一致しない値を検索する。 |
Range | From より大きく、To より小さい値を検索する。 |
Greater Than | Find Values Greater Than よりも大きい値を検索する。 |
Lower Than | Find Values Lower Than よりも小さい値を検索する。 |
Unknown | (不明。指定した型に合う全候補を表示?) |
その他の主なポイントは以下のとおりです。
- デフォルトではマップされたメモリが検索対象に含まれない(エミュレータのメモリアドレスが見つけられない可能性がある)ので、Options の General Search Options から設定画面を開いて、General Search タブで MEM_MAPPED を検索対象とするよう、チェックを付けるとよいかもしれません(ただし検索速度は遅くなります)。
- Search Range は検索対象とするメモリアドレスの範囲です。おおよそ変更する必要はありません。
OKボタンを押して検索を行うと、Found Addresses の一覧に結果が表示されます。
多くの場合、ここから絞り込み検索を必要とします。Found Addresses ウィンドウにある、虫眼鏡(複数)アイコンのボタンをクリックします(あるいはメニューから Search → Sub Search を選択)。
すると Sub Search ダイアログが表示されます。使い方は先ほどのダイアログと同じなので割愛します。
探しているメモリアドレスが見つかったら、項目を右クリックして Add Selected を選択します。
メインウィンドウで特定のメモリアドレスの値を見ることができるようになりました。
ウォッチの編集、改造コード機能の利用
メインウィンドウにあるメモリアドレス一覧の項目をダブルクリックすると、Modify Address ダイアログが開きます。
- Description を編集して、説明文を変更できます。
- Type を変更すると、値のサイズ・型が変更できます。
- Show as Hex にチェックを入れると、値を16進数で表示できます。
また、Locked のチェックボックスにチェックを付けると、改造コード機能が利用できます。Lock Type の意味は下記のとおりです。
Evalutation Type | 説明 |
---|---|
Exact | 指定値を強制する。 |
Range | 指定した下限値〜上限値の範囲を強制する。 |
No Lower Than | 指定値より小さくならないよう強制する。 |
No Greater Than | 指定値より大きくならないよう強制する。 |
OKを押すと変更が反映されます。
おまけ:アドレス計算に式を利用する
動的に確保されるメモリ領域はメモリアドレスが不定になるため、ここまでで紹介した方法では、起動後に毎回再検索しなければなりません。MHS にはポインタの参照先を辿って動的にアドレスを指定する方法が用意されています。
Modify Address ダイアログの Normal Address タブを開きます。
中断の Complex Address (Overrides Simple) というチェックボックスにチェックを付けると、下部の入力欄にて、メモリアドレスの表現に式が利用できます。
計算式の仕様は下記のとおりです。
記述例: [40B0F0] + 0x1536 + ([40B0F4] & 0xff)
おまけ:値を計算式で加工して表示する
Expression Evaluator ウィンドウに式を入力して追加すると、値を計算式で加工して表示することができます。
計算式の仕様は、動的アドレス計算に使用するものと同じです(上記参照)。
メモリウォッチ内容の保存
MHS を終了する前に、メモリウォッチの内容を保存しておきましょう。
ファイルの保存は、メニューから File → Save Selected As を選択して行います。
保存したファイルは次回、File → Open Save File から開くことができます。
まとめ
とりとめのない紹介になりましたが、下記をもってまとめとします。
- MHS を使えば簡単・強力にメモリの検索・監視・書き換えが行える。
- 解析技術があれば、動的に変化するアドレスにも柔軟に対応できる。よくわからなければ、メモリアドレスによっては、起動ごとに毎回検索する必要があることに注意すべし。
- MHS には Script など、まだ紹介されていない興味深い機能が多数ある。
Windows 上で動くゲームの TAS 制作を考えている方の参考になればうれしいです!