TOP
メインサイトへ戻る ミラーサイトへ戻る

「VMware」を用いたフルスクリーン型ゲームへの対処

目次

解説

追加注意事項

  • 拙作ソフト「うさみみハリケーン」の「スペシャルねこまんま57号」遠隔操作機能により、LAN接続されたマシン間で簡単にリモート解析が出来ますので、そちらもお試しください。


  • 「スペシャルねこまんま57号」は、当チュートリアル執筆以後にインターフェイスを変更し、いくつかの機能をボタンでなくメニューから呼び出せるようにしていますのでご注意ください。インターフェイスの詳細はヘルプをご覧ください。


  • 「VMware Workstation」開発元が公開している、「VMware Workstation」などで作成された仮想マシンを実行するフリーウェア「VMware Player」と「うさみみハリケーン」の組み合わせによる、ゲストOS上で実行されているアプリケーションをホストOS上の「vmware-vmx.exe」ごと解析するというアプローチもあります。「VMware Player」用仮想マシン作成方法についてはGoogle等検索サイトで「VMware Player QEMU Windows」などの検索結果を参照して下さい。

    このケースでも、ゲストOS上の解析対象アプリケーションのメモリ割り当て方法等(対象アドレスがモジュールエリア内あるいはメモリ管理API関数により割り当てられたメモリエリア内)に関わらず、「vmware-vmx.exe」プロセス上からのプロセスメモリの検索と書き換えが可能です。 ホストOS上で「VMware Player」のプロセス「vmware-vmx.exe」が確保する、ゲストOS上で実行されるアプリケーション用のメモリエリアは、「VMware Player」実行時に一時作成されるvmemファイルをマップしたサイズ0x100000のメモリエリアのいずれかになります。「vmware-vmx.exe」のプロセスメモリ検索時には、あらかじめメモリマップを参照して検索範囲を絞り込み、さらに検索対象メモリエリア属性を「Commit-ReadWrite」に指定することで検索の効率化が図れます。

    ●動作確認環境
    VMware Player: Version 1.0.1
    ホストOS: WindowsXP SP2
    ゲストOS: Windows2000 SP4


  • VMware4.0では、下記手順4で選択するホストOS上のVMwareプロセスは「vmware-vmx.exe」になります。その他の解析手順は以下と同様です。

概要

このチュートリアルでは、仮想マシン構築ソフトである「VMware」を用いたDirectX排他モード等最前面全画面固定型(いわゆるフルスクリーン)ゲームの解析及び改造を解説します。

従来このようなフルスクリーン型ゲームの解析及び改造には、カーネルモードデバッガあるいはLANリモート機能付きプロセスメモリエディタ等によるアプローチが用いられていました。しかし、メモリ解析からブレークポイント設定という一連の操作において、いずれも一長一短があります。

そこで、従来の方法の各問題点に対処した、「VMware」を用いたアプローチを考えてみました。

「VMware」について

「VMware」は既存のパソコンのOS上で、独立した仮想マシンを構築するソフトウェアです。この仮想マシン上に通常のパソコン同様OSをインストールすることにより、1台のパソコン上で複数台の別の(仮想)パソコンも同時に操作可能となります。これにより、ソフトウェアの各種OS環境における動作確認の簡易化が図れます。さらに、「VMware」で構築された仮想マシンは、その仮想マシン上で行われた総ての操作を無効化して元に戻すことも可能なため、システムに操作を加える各種アプリケーションの試用にも有用です。なお、「VMware」をインストールした既存のパソコンのOSを「ホストOS」、構築された仮想マシン上のOSを「ゲストOS」といいます。
(参考イメージ1)

なお、仮想マシン構築ソフトは他にもあるのですが、その中で操作性等が優れているといわれている「VMware」を選択しました。

「VMware」の入手は公式サイト(リンク先ページ下方に日本語ページへのリンクあり)でのダウンロード販売で可能です。ただし、日本語版と英語版で価格が大きく異なりますので注意が必要です。私が試した限りでは「VMware」英語版は日本語版Windows2000での使用に問題ないことから、恐らく日本語版WindowsXPでも問題なく動作すると思われます。そのため、英語版を購入される方が少なくないと考えられます。なお、購入前に各自のインストール環境で十分に試用し、動作に問題ないと判断した上で自己の責任において購入してください。また、一般的にこのような海外のソフトウェアの購入は、販売元が実績のある有名ソフトウェア製作会社でない場合、クレジットカードでの支払いは避けた方が無難です。この場合、手数料はかかりますが、米ドル建ての国際郵便小為替での支払いの方が安全といえます。他にはネット上でのソフトウェア購入代行業者のサービスを用いるという選択肢もあります。

また、「VMware」公式サイトでは英語版の詳細なマニュアルがDLできますので、こちらも併せて入手されることを強くお奨めします。特にサウンドドライバ関連の設定等は、このマニュアルの指定通りに行わないと失敗することがあります。

「VMware」Ver3.0のシステム所要スペックは下記となっています。
・Processor. 266MHz or faster processor (400MHz or faster recommended), single or multiprocessor.
・Memory. 128MB minimum (256MB recommended).
・Disk drives. 20MB free space required for basic installation. At least 500MB free disk space recommended for guest operating system and applications.

しかし、実際にゲームの解析に用いる場合は上記推奨スペックでも不十分です。上スペックは「ホストOS上でVMwareとゲストOSを起動可能なスペック」で、実際には解析対象ゲームの所要メモリを併せて考慮する必要があります。私がこのチュートリアル執筆にあたり用いているスペックは下記ですが、実際のゲームの解析ではメモリ512MB以上の実装をお奨めします。メモリが逼迫していると、ゲストOS上で解析対象がフリーズしたり、「スペシャルねこまんま57号」他解析ツールの各種処理が緩慢になることがあります。
・Processor. Celeron1GHz singleprocessor.
・Memory. 256MB.

「VMware」をインストール可能なWindowsOSは、WindowsNT,2000及びXPです。また、「VMware」により構築された仮想マシン上ではいずれのWindowsOSもインストール可能です。

仮想マシンの構築

仮想マシンの構築は、「VMware」のメニューから File → New → New Virtual Machine でウィザードが起動します。ウィザードでの仮想マシン構築後は通常のパソコン自作のケースと殆ど同じです。ハードディスクのフォーマットやOSのインストールについては、パソコン自作関連サイト等で詳細な情報を得ることが可能ですので、ここでは省略します。

なお、ゲストOSとしてWindows95をインストールする場合は、CONFIG.SYSの設定を変更しないと仮想マシン上でOSが起動しません。公式サイト上に対処方法の説明があります。未確認ですがWindows98でも同様のケースが起こりうると考えられます。

仮想マシンにゲストOSのインストールが完了したら、「VMware Tools」(「VMware」のメニューの Settings → VMware Tools Install)と「スペシャルねこまんま57号」をインストールします。次に、ゲストOSの「スペシャルねこまんま57号」をインストールしたフォルダをホストOSとファイル共有可能にしてください。なお、ファイル共有についてはフォルダの設定だけでなく、コントロールパネルからネットワークの設定でプロトコルの設定も忘れずに行ってください。特にゲストOSがWindows9x系の場合は、NetBEUIプロトコルの設定も必要になります。

最後に解析対象のゲームをインストールします。これで解析準備が整いました。

なお、「VMware」メインウィンドウ左側リストで構築した仮想マシンを選択して、構築した仮想マシンの「Virtual Disk」ダブルクリックで設定画面が呼び出されるので、「Mode」を「Undoable」にしておくことをお奨めします。これにより、仮想マシンのセッション終了時に、仮想マシン上で行った総ての操作を元に戻すか否か選択可能になります。
(参考イメージ2)

当チュートリアルでの解析例について

当チュートリアルでは実際のゲームを用いた解説は行いません。理由は、私の知る限り仮想マシン上での動作を保証しているゲームがないからです。このような動作保証外の仮想マシン上でのゲーム動作例(しかも解析・改造目的)をネット上で公開した場合、そのゲームの製作ソフトハウスとの無用なトラブルを招く可能性があると判断しました。なお、実際には以下で述べる解析手順は、DirectX排他モードの某育成ゲームを用いて確認しています。

そこで、当方で製作した「検索テスト用パラメータ及びフラグ変動シミュレータ」(以下「検索用シミュレータ」)を解説に用いることにしました。このソフトウェアは一般的なプロセスメモリ検索の練習を目的として、ゲーム解析を始めたばかりの方向けに製作していたものです。プロセスメモリ検索が適切に行われたか自分で判断できるように、最終的な検索結果となるパラメータやフラグの格納アドレスも表示しています。

この「検索用シミュレータ」は、解析途中で手順に誤りがないか確認できるよう、「意図的に」フルスクリーン表示にしていません。そのため、以下の解析手順は「フルスクリーンのつもりで」行ってください。

当チュートリアルでの解析環境は下記の通りです。
VMware:Ver3.0 英語版
CPU:Celeron1GHz singleprocessor
メモリ実装:256MB
ホストOS:Windows2000(Pro)
ゲストOS:WindowsMe
ゲストOSへのメモリ割り当て:256MB中64MB
「スペシャルねこまんま57号」:バージョン1.07ベータ1以降及び同梱「UsaHook2.dll」。旧バージョンの「スペシャルねこまんま57号」と「UsaHook2.dll」は「VMware」を用いた解析に対応していません。

以下の文章を読む前に、「スペシャルねこまんま57号」のヘルプに目を通されることをお奨めします。例えば下記文章で用いられる「メインエディットボックス」や「アドレス保持用エディットボックス」については、同ヘルプ中の「スクリーンショットと機能マップ」でその位置を明示しています。

以下の各手順を行うのが、ホストOS上かゲストOS上か逐一確認されることをお奨めします。特にホストOS上でフォーカスがVMwareのウィンドウ上にあるか否かに注意してください。以下の手順を行う際に誤りがあると、後で復旧するのは困難なため大抵最初からやり直すことになります。

他には「スペシャルねこまんま57号」のキーフック機能を使う際に、キーフック対象ウィンドウが最上位にあるか注意してください。なお、実際のゲーム解析においては、対象ゲームがキーフック防止機能を実装している可能性もあります。

仮想マシン上のゲーム解析手順

1.ゲストOS上で解析対象のゲームを「スペシャルねこまんま57号」のキーフック対象にタイマー予約

まず、ゲストOS上で「スペシャルねこまんま57号」を起動します。次にメインウィンドウ下部右側にある「タイマー」ボタンでタイマー設定画面を呼び出します。次に、タイマーの動作で「最上位ウィンドウをキーフック対象にセット」を選択し、1分後程度にタイマーをセットします。

(参考イメージ3)
(参考イメージ0):「スペシャルねこまんま57号」の「タイマー」ボタン等の位置を明示

2.ゲストOS上で「スペシャルねこまんま57号」の検索条件を後述目印用文字列に設定

起動済「スペシャルねこまんま57号」のメインウィンドウ下部左側にある、「メモリ検索」ボタンで検索ウィンドウを呼び出します。次に、通常検索の条件を「文字」に設定し、その右の入力欄に「ののぴょん」他特徴のある文字列を入力しておきます。大抵の場合、検索範囲は初期設定のままで構いません。
(参考イメージ4)

3.ゲストOS上で解析対象のゲームを「スペシャルねこまんま57号」のデバッガから起動

「スペシャルねこまんま57号」のメインウィンドウ下部左側にある「デバッガ」ボタンでデバッガウィンドウを呼び出します。
ブレークポイント設定を「ハードウェア」に設定し、さらにブレークポイント条件には「書込」を選択します。そして、「オプション」で「障害発生時にメッセージボックス非表示」と「ハードウェアブレークポイントを全スレッドに一括設定」を「必ず」設定します。
(参考イメージ5)

なお、「スペシャルねこまんま57号」のデバッガを含め、一般的にデバッガでプログラムを起動あるいはアタッチすると、そのプログラムのメモリアクセスのバグ等潜在的な問題が顕在化することがあります。この場合、デバッガで対処できない深刻なケースでは対象プログラムを終了せざるを得ません。

以上の設定が終了したら、「検索用シミュレータ」をデバッガから起動し、そのウィンドウを最上位にしておきます。この後予め設定しておいたタイマーにより、最上位にある「検索用シミュレータ」のウィンドウがキーフック対象にセットされます(セット時ビープ音あり)。

4.ホストOS上で「スペシャルねこまんま57号」を用いて、「VMware」プロセス内のゲストOS用メモリエリアを特定

ホストOS上で「スペシャルねこまんま57号」を起動し、メインウィンドウ最上部のプロセスリスト上で「VMware」のプロセスを選択します。次にメインウィンドウ上部左側にある「操作」ボタンで選択プロセス操作用メニューをポップアップさせます。そのメニューから「モジュール・スレッド一覧・メモリマップ」を選択します。
(参考イメージ6)

上記の操作で表示されたウィンドウの右側にあるメモリマップで、「VMware」プロセス内のゲストOS用メモリエリアを探します。このメモリエリアのサイズは、仮想マシンに割り当てたメモリサイズそのものです。つまり、割り当てメモリが64MBなら04000000hで128MBなら08000000hとなるので簡単に探し出すことが可能です。
(参考イメージ7)

目的のメモリエリアが見つかったら、メモリマップ上でそのメモリエリアをダブルクリックします。これにより、「スペシャルねこまんま57号」のメインウィンドウ上のアドレス指定エディットボックスに当該メモリエリア先頭アドレスがコピーされ、さらにメインエディットボックスに同アドレス以降のバイナリデータを表示します。

5.ホストOS上で「VMware」プロセス内にある改造対象ゲームのパラメータのアドレスを特定

ホストOS上で起動済の「スペシャルねこまんま57号」メインウィンドウ下部左側にある「メモリ検索」ボタンで検索ウィンドウを表示し、さらに「メモリ検索」ボタンの下にある「アドレス転写」ボタンを押します。これで検索開始アドレスに「VMware」プロセス内のゲストOS用メモリエリア先頭アドレスが設定されます。また、通常検索の範囲はゲストOS用メモリエリアのサイズに設定しておけば、より効率的な検索が可能です。

ここからは一般的なメモリ検索を行います。メモリ検索の手法には色々なアプローチが考えられますので、各自で試行されることをお奨めします。なお、通常では起点補正は必ずしも必要ではありません。一般的にコンパイラが設定する変数格納アドレスはダブルワード境界に設定されるからです。ただし、変数のサイズが2バイトならば場合によってはワード境界に合わせる必要がありますし、値を変数としてではなく配列の要素としてメモリ上に格納している場合は起点補正が必要なケースもあります。

まずは固定アドレスのパラメータを検索してみましょう。通常検索でアプローチするならば検索条件に「16進」を選択し、さらに「10」(10進→16進自動変換)ボタンを有効化します。その上で検索条件入力欄に「500」と入力して「通常検索実行」ボタンです。

しかし、検索結果の該当件数は膨大となるため、この結果から絞り込む必要があります。ゲストOS上で「検索用シミュレータ」の固定アドレス用の「パラメータ増加」ボタンを押して、当該パラメータを100増加させます。そしてホストOS上の「スペシャルねこまんま57号」検索ウィンドウで、先ほど「500」と入力した欄を新しい値である「600」に書き換えて「通常検索実行」ボタンです。これで該当箇所は大抵1箇所に絞り込まれる筈です。なお、この固定アドレスのパラメータには、変動検索の「指定値の増減」でのアプローチも効果的です。この指定値には「100」や「-100」等正負両方の値を指定可能です。
(参考イメージ8)

次は環境依存型変動アドレスのパラメータに変動検索でアプローチします。ホストOS上の「スペシャルねこまんま57号」検索ウィンドウで、比較用メモリの「確保・記録」ボタンを押して変動検索用比較データを作成します。次にゲストOS上で「検索用シミュレータ」の環境依存型変動アドレス用の「パラメータ増加」ボタンを押して、当該パラメータを増加させます。ここでホストOSの「スペシャルねこまんま57号」検索ウィンドウに戻り、比較単位を4バイトに設定してから「値変動」ボタンで変動箇所を検索します。この場合も該当件数は膨大となるため、さらに同パラメータを増加または減少させて「値変動」ボタン、あるいは同パラメータはそのままで「値不動」ボタンで絞り込んでいきます。もし比較単位が限定されるならば「値増加」や「値減少」ボタンでの絞り込みも効果的です。

もし上記操作でうまく環境依存型変動アドレスのパラメータ格納アドレスを特定できない場合は、比較単位または検索・比較基点を変更してみてください。特に「VMware」プロセス内のゲストOS用メモリエリアサイズが、「スペシャルねこまんま57号」変動検索の検索・比較範囲設定値を超えている場合は、もし検索がうまくいかなければ、検索・比較基点をスライドさせて新しい検索範囲で新たに検索及び絞り込みを行う必要があります。
(参考イメージ9)

単純フラグの検索は、値00hや値01hで16進1バイトデータを通常検索すると該当件数が膨大となるため、変動検索でのアプローチが効果的です。ビットフラグは、値が特徴的ならば通常検索で絞り込んだ方がスムーズに検索できます。

ちなみに、「検索用シミュレータ」は、固定アドレスのパラメ−タを格納する変数のアドレスの近辺に、「ねこまんま」という初期化文字列データを入れてあります。さらに、環境依存型変動アドレスのパラメータ用に3つの関数で確保したメモリエリアにも、そのエリア先頭近辺に「ねこまんま」文字列対応バイナリデータを書き込んでいます。そのため、「VMware」のゲストOS用メモリエリア内で「ねこまんま」という文字列検索を行えば、「検索用シミュレータ」のパラメータ格納アドレスがすぐに判明します。このような検索でヒットさせるため等の目的でメモリ上に埋め込むバイナリデータを、当チュートリアルでは「目印用文字列」と称しています。

検索によりパラメータのアドレスが絞り込めたら、検索結果出力リスト上で当該アドレスをダブルクリックします。これにより「スペシャルねこまんま57号」のメインウィンドウ上のアドレス指定エディットボックスに同アドレスがコピーされ、さらにメインエディットボックスに同アドレス以降のバイナリデータを表示します。ここで同アドレスに格納されている値を書き換えて、実際にゲストOS上の「検索用シミュレータ」に反映されるか確認します。書き換えが反映されなければ、そのアドレスは目的のものではありません。

さらに、バイナリデータ保持用エディットボックス上にある「+8h/栞」ボタンを押して、検索で判明したパラメータのアドレスを「確認」「更新」「クリア」ボタンの下にあるアドレスリストに追加します。このアドレスリストで特定のアドレスを選択すると、選択したアドレス以降のバイナリデータをメインエディットボックスに表示します。
(参考イメージ10)

6.手順5で特定した、ホストOS上「VMware」プロセス内アドレス近辺に目印用文字列を作成

これまでの操作で、ゲストOS上の「検索用シミュレータ」での、固定アドレスと環境依存型変動アドレスの2つのパラメータが格納されている、ホストOS上「VMware」プロセス内アドレスが判明している筈です。

単にパラメータの値を変動させるだけならばここまでの操作で十分ですが、当チュートリアルでは最終的に逆アセンブルコードリスト上でのパラメータ増減処理箇所まで特定します。そのため、上記ホストOS上「VMware」プロセス内アドレスをもとに、ゲストOS上の「検索用シミュレータ」プロセス内アドレスを導く必要があります。

そこで前述の「目印用文字列」をホストOS上「VMware」プロセス内に埋め込み、その目印用文字列をゲストOS上の「検索用シミュレータ」プロセス内で検索します。この際、実際のゲーム解析においては解析対象がフルスクリーンのため、キーフックを用いてバックグラウンドから目印用文字列の検索を行います。

そこで、ホストOS上「VMware」プロセス内のパラメータ格納アドレス近隣(+10h等)に「スペシャルねこまんま57号」の文字列更新機能を使って「ののぴょん」という文字列を書き込みます。この目印用文字列は、手順2においてゲストOSで「スペシャルねこまんま57号」検索ウィンドウ上で検索条件に設定した文字列と同一である必要があります。
(参考イメージ11)

7.ゲストOS上で「スペシャルねこまんま57号」のキーフックを用いて、手順5で特定したアドレスをゲストOS上の実アドレスに変換

ゲストOS上で、「検索用シミュレータ」が最上位ウィンドウであることを確認してから「Page Up」キーを押します。これにより、「スペシャルねこまんま57号」のキーフック機能で、目印用文字列を「検索用シミュレータ」のプロセス上で検索します。この検索結果による目印用文字列のアドレスをもとに、各パラメ−タのゲストOS上のアドレス、即ち「検索用シミュレータ」のプロセス内でのアドレスを得ます。

このゲストOS上での検索は、ゲストOSへのメモリ割り当てが少ない場合はそれに相応して検索に時間がかかります。

さらに「Shift」キーを押しながら「Page Up」キーを押すと、「スペシャルねこまんま57号」検索ウィンドウの検索結果上位10件を「NekoList.txt」というテキストファイルに出力します。このテキストファイルは、「スペシャルねこまんま57号」の実行ファイルと同じフォルダに出力されますが、既存の同名ファイルがあると無警告で上書きしますので注意してください。

実際の解析では、ゲストOS上では解析対象ゲームがフルスクリーンとなっているので、ゲストOS上の「スペシャルねこまんま57号」検索ウィンドウの検索結果を見ることはできません。そこで、キーフック機能を用いてこの検索結果を「スペシャルねこまんま57号」の実行ファイルと同じフォルダにテキストとして出力し、同フォルダを共有しているホストOS上からそのテキストファイルを開く訳です。この際、ホストOS側からみているゲストOS側のフォルダの内容は最新の状態に更新させないと、出力した「NekoList.txt」が表示されないことがあります。
(参考イメージ12)

8.手順7で得られた実アドレスに「スペシャルねこまんま57号」のキーフックを用いてブレークポイントを設定

これまでの操作で、ゲストOS上「検索用シミュレータ」プロセス内での各パラメータのアドレスを特定できました。そこで、今度はそのアドレスへの書き込みメモリアクセスにブレークポイントを設定します。

手順7の段階で、ホストOS上から、共有されているゲストOS上の「スペシャルねこまんま57号」がインストールされているフォルダを開かれている筈です。そこで、その共有フォルダ内に「NekoBP.txt」というテキストファイルを新規作成し、そのテキストファイルを開いてからブレークポイントを設定するパラメータのアドレスを半角英数字で書き込みます。この際アドレス以外のスペース等文字列及び改行は絶対に書き込まないで下さい。ブレークポイントを設定するアドレスを「NekoBP.txt」に書き込んだら、同ファイルを上書き保存します。

次に、ゲストOS上で「検索用シミュレータ」が最上位ウィンドウであることを確認してから、「Shift」キーを押しながら「Num Lock」キーを押します。これにより、「NekoBP.txt」に書き込まれたアドレスを、「スペシャルねこまんま57号」デバッガウィンドウのハードウェアブレークポイント用アドレス入力欄に書き込みます。さらに「Num Lock」キー押せば、指定したアドレスにハードウェアブレークポイントを設定します。
(参考イメージ13)

9.手順8で設定したブレークポイントでブレークさせて、解析対象のゲームのプログラム中でのパラメータ操作箇所を特定

手順8でパラメータのアドレスにブレークポイントを設定していますので、あとはゲストOS上で、「検索用シミュレータ」を操作して同パラメータの値を変動させます。これまでの操作に問題がなければこれでブレークする筈です。ブレーク時にはビープ音を鳴らします。ブレーク後に前述「NekoBP.txt」の内容を書き換えて、別のアドレスに新たにブレークポイントを設定することも可能です。

ブレーク結果は「スペシャルねこまんま57号」のデバッガウィンドウ内に出力されます。ここで表示されているEIPレジスタの値が、ブレーク時に実行されたコードの次のコードの開始アドレスになります。

ここでゲストOS上の「検索用シミュレータ」を終了させます。そして同実行ファイルを適当な逆アセンブラで逆アセンブルして、「スペシャルねこまんま57号」のデバッガで得られたEIPレジスタの値をもとに、逆アセンブルコードリスト上でのパラメータ操作箇所を特定します。
(参考イメージ14)

10.対処

以上で得られた解析結果をもとに、改造コードを作成します。パラメータを単純に書き換えるものや、パラメータ減少回避(無敵化)等色々なパターンが考えられます。なお、環境依存型変動アドレスを直接書き換える場合は、「スペシャルねこまんま57号」のポインタ型改造コードを使用する必要があります。

「スペシャルねこまんま57号」用改造コードは下記。ただしこれはほんの一例ですので、色々試行されることをお奨めします。
;パラメータ単純書き換え
004020FC-E703
*00402100>1000-65
;パラメータ減少回避
004013A8-00
0040142A-00
お疲れ様でした。このチュートリアルがあなたのお役に立てば幸いです。
管理人:うさぴょん
URL: メイン非常用ミラー
Copyright © 1996-2006 Usapyon All rights reserved.