基礎用語 プロセスメモリ上の未使用領域
概要
ひとつのプロセス(プログラムの実行単位)に対応するプロセスメモリの内容として、プログラム用に確保はされているが、プログラムを実行する上で使用しない部分が存在します。当ソフトウェアが扱う「プロセスメモリ」とは、Windowsがプロセスのために用意したメモリ空間を意味します。なお、プロセスメモリ上のアドレスは仮想のものであり、PCに装着されたメモリ内の物理アドレスとは異なります。 実行ファイルの各セクション(実行ファイル内の用途や種類別に分けられたブロック)終端近辺には大抵未使用領域があり、その実行ファイルがプロセスメモリ上にロードされたメモリエリアであるモジュールエリア内では、上記未使用領域に対応するメモリエリアは「プロセスメモリ上の未使用領域」となります。この未使用領域のバイナリデータは00hなので容易に視認できます。また、EXEファイルがロードされたこのメモリエリアのアドレスはOS等の環境で変化することはありません。なお、Windows Vista以降では、EXEファイルやDLLファイルといったモジュールがプロセスメモリ上に読み込まれるアドレスをランダム化する、セキュリティ上の脆弱性を緩和する機能ASLR(Address Space Layout Randomization)が実装されています。しかし、このASLRは、当ソフトウェアに同梱しているPEエディタ『UMPE』を用いれば簡単に無効化することが可能です。ASLR無効化の操作手順は上記リンクを参照してください。 この「プロセスメモリ上の未使用領域」は、パラサイトルーチンの埋め込みや新規作成変数の格納、さらに改造コード使用時に書き換え前の値の退避先等、色々な用途に用いることが可能です。パラサイトルーチンとは、プログラムに新たな処理や機能を追加するために、既存のルーチン(処理を行うためのプログラムコードの固まり)を変更あるいは別途コードを追加して作成するルーチンのことです。 なお、アプリケーションが使用する変数等を格納する「DATA」や「.data」等データセクションに対応するメモリエリアでは、バイナリデータが00hの連続である場合も変数格納用に確保されていることがありますので注意が必要です。 プロセスメモリ上のモジュールエリアにおいて、PEヘッダ(実行ファイルの設定情報を格納している部分)内の未使用領域も使用可能ではありますが、この領域にコードを書き込んだ場合、セキュリティソフトからウイルス感染と誤認される可能性もあるためお奨めしません。なお、プログラムコードを格納するコードセクション内ならば、コンパイラのCodeAlign機能により生成されたパディング箇所(大抵90hやCChのバイナリデータで埋められコードとして実行されることはない箇所)も未使用領域として使用可能です。 |
未使用領域の確認
まず、対象プロセス選択後、メニューの[移動]→[表示アドレスを指定]でメモリマップを取得し、メモリマップ上でメインモジュール(EXE)先頭アドレスを選択します。「表示アドレス指定」ダイアログ右下にセクションリストが表示されるので、 表示アドレスを変更してダンプ表示ウィンドウ上で各セクション終端近辺にある未使用領域を確認します。 |
未使用領域が書き込み不能領域の場合の対処
対象未使用領域のメモリエリアが書き込み不可の場合は、メニューの[編集]→[指定メモリエリアのアクセス属性変更]でアクセス属性を変更して対処してください。同様の操作を改造コードの「アクセス属性変更型改造コード」でも行うことが可能です。なお、パラサイトルーチンを書き込む場合は実行属性も付加しておいてください。 |