日別アーカイブ: 2013年5月15日

ProcMonでレジストリ監視

アプリケーションでレジストリを参照している時、なぜかレジストリの中身が更新されてしまい思うように動かないという事態が発生し、レジストリを更新したのが何者なのか?を特定する為に監視したいという話がありました。

そこで、ちょっと使い方を気になっていたProcessMonitor (ProcMon.exe) を使ってみることにした。

ProcessMonitor の導入

ProcessMonitor はSysInternals Suiteの中の一つとして提供されています。
もちろん単独でもダウンロード可能

Process Monitor -Windows Sysinternals
http://technet.microsoft.com/ja-jp/sysinternals/bb896645.aspx

Windows上で動作するプロセスの様々な動作をリアルタイムに記録するという、障害調査する上では中々頼もしいツールです。
実行ファイル単独で動くので、比較的導入に対するコストもかからない。

起動とフィルターの設定

ProcMonを起動するとフィルター設定が出てくる

デフォルトで設定されているフィルターは基本的にはそのままでいいのだが、
ここではわかりやすくする為に選択してすべてをRemoveしてしまう。

その後、監視対象となるレジストリパスを登録する。
登録は左から「Path」、「is」、「レジストリパス」、「Include」でいい。

ここでは、テスト的にODBC設定を監視してみることにする。

 気を付けなければいけないのは、レジストリパスの指定。

RegEdit等でキーをコピーすると、通常

HKEY_CURRENT_USER\Software\ODBC\ODBC.INI

のように始まる。
このパス名をフィルターに適用すると対象としてみてくれなかった。

このような場合は、

HKCU\Software\ODBC\ODBC.INI

のように省略キー名称で設定する必要がある。
省略キーの対応は以下の通り。

HKEY_USERS HKU
HKEY_LOCAL_MACHINE HKLM
HEKY_CURRENT_USER HKCU
HKEY_CLASSES_ROOT HKCR
HKEY_CURRENT_CONFIG HKCC

なんで完全キー名称ではだめで、省略キー名称じゃなきゃいけないのかは正確な理由はわからないが、単純に表示するリストビューの幅を節約するために省略して保存。
その保存したものにフィルターするから適用されないんじゃないかと推測している。

基本的に起動=キャプチャ開始状態になる。

上記の画面キャプチャにて、左下に「No events」と表示されている。
実は、デフォルトの設定ではここにものすごい数のイベントが、秒単位で増えていくことが表示される。
これは、デフォルト設定ではProcMonがフィルターで設定したイベント以外も全て記録しようとしているからだ。

フィルターで設定したものだけを記録する形にしないと、メモリやディスクを圧迫することになるので「Filter」→「Drop Filtered Events」にチェックを入れる。

 基本的な設定はこれで完了したので、動作を確認してみる。

 RegEdit.exeで対象のレジストリにアクセスすると

 問題なく記録された。

 “レジストリの監視”と言う話でいえば間違ってはいないのだが、もう少し手心を加えると

  • レジストリのPath指定で「is」ではなく「begins with」を指定してKEY配下のVALUEに対する操作を検知する
  • レジストリの編集のみを記録するため、以下のようなフィルターを追加する
    • Operation」、「is」、「RegQueryKey」、「Exclude
    • Operation」、「is」、「RegEnumValue」、「Exclude
    • Operation」、「is」、「RegOpenKey」、「Exclude

などなど。

他にも設定していけば、自分の求める情報をピンポイントで手に入れることができる。「Operation」に対して「RegSetValue」を「Include」で設定してもいいのかもしれないが、それはレジストリに対しての操作が何で行われていたかがはっきりしている場合に限られる。削除して追加したかもしれないし。

そういう意味では、上記のように関係ないものを除外するフィルターを追加していくのがいいのではないかと考えている。
試しに適当に動かしてみて、キャプチャーした内容を見たうえで除外のフィルターを作っていくのが一番確実だと思われる。

 

これで監視出来ているといえるが、もう少し手軽に監視をするために設定情報をエクスポートしておいて、バッチにて起動・停止出来るようにしておく。

File」→「Export Configuration…」で構成ファイルをエクスポート。
その後、バッチファイルでprocmonを次のような形で呼び出す。

procmon /minimized /backingfile <出力ファイルパス>\%date:~-10,4%%date:~-5,2%%date:~-2,2%%time:~-11,2%%time:~-8,2%%time:~-5,2%.pml /loadconfig <構成ファイルパス>

停止時には

Procmon /terminate

で停止するバッチをたたく形にする。

一応、最小化状態で立ち上げるための「minimized」を指定しているけど、タスクバー上に出てしまう上にバッチのDOSプロンプトまで出てしまうので正直微妙なのだが、まぁ手軽にはなったかな。

再起動時の動作に対して疑いたいときは、「Option」→「Enable Boot Logging」をONにする。

ダイアログが出てくるが、とりあえずそのまま「OK」でいい。

再起動後にProcMonを立ち上げると、ログを保存するか聞いてくるので保存すればOK。ただ、これに関しては試してない。
Helpには

If you configure boot logging and the system crashes early in the boot you can deactivate boot logging by choosing the Last Known Good option from the Windows boot menu (which you access by pressing F8 during the boot).

なんてことも書いてあるから、使うときは少し注意したほうがいい気もする。

今回はレジストリの監視にProcMonを使ってみたが、このツールは使いこなせばいろいろな調査に役立つ。
SysInternalsのツールはこういう役立つのが実に多いんだけど、使い方に慣れるのに少し手間取ってしまったりするな。

参考:Process MonitorについてのTips - Ask Core
http://blogs.technet.com/b/askcorejp/archive/2010/01/29/process-monitor-tips.aspx