Procmonの究極のガイド

Procmon。すべての種類のWindowsアクティビティを追跡するための悪名高いWindows Sysinternalsのユーティリティ。登録キーへの未知の変更を行う不正なソフトウェアインストーラーの追跡や、ウイルスのトレースの調査能力で知られています。

Windowsレジストリ、ファイルシステム、プロセス、またはネットワークのアクティビティを調査する必要があり、procmonを使用することに決めた場合、この記事が役立ちます。

この究極のガイドでは、インストールから基本的な使用方法、さまざまなユースケースまで、procmonユーティリティの使用方法についてすべてを学ぶことができます。

前提条件

この究極のガイドは、ほとんどのWindowsシステムに適用されますが、完全性のため(およびWindows 3.1コンピュータでprocmonを実行しようとすることを防ぐために)、次のものが必要です:

  • A Windows Vista or Windows Server 2008 or higher machine (x86 or x64)

以上です!このガイドでは、Windows 10ビルド1909 x64マシン上でprocmon v3.6を使用します。

Procmonのダウンロードと実行

開始するには、Windowsマシンでprocmonを実行する必要があります。2つの異なる方法で取得できます。従来のダウンロード方法とWindows SysinternalsがSysinternals liveと呼ぶ方法です。

昔ながらの方法

Procmonはインストールする必要がありません。単一の実行可能ファイルです。 ZIPファイルをダウンロードして取得できます。ダウンロードしたら、お気に入りのツールでZIPファイルを展開してください。以下は、ホームフォルダーに保存した場合のPowerShellコードスニペットです。このコードスニペットは、〜\ProcessMonitorフォルダーを作成し、必要なすべてのファイルが含まれます。

Expand-Archive -Path '~\ProcessMonitor.zip' -Destination ProcessMonitor

〜\ProcessMonitorフォルダー内には、次の5つのファイルが表示されます:

  • Eula.txt–Procmonを実行する前に受け入れる必要があるライセンス契約書です。
  • procmon.chm–提供されているすべてのドキュメントが含まれているヘルプファイルです。
  • Procmon.exe–正しいprocmonインスタンス(x86またはx64)を起動するメインEXEです。
  • Procmon64.exe–x64 procmonバイナリです。
  • Procmon64a.exe–アルファ64 procmonバイナリです。

今、〜\ProcessMonitor\procmon.exeファイルを呼び出してprocmonを実行します。

Procmonは昇格された権限でのみ実行されるため、実行時にUACが有効になっている場合は、これを受け入れるように求められます。これについて後で触れます。

Sysinternals Live

もしもEXEをダウンロードすることができない場合、またはしたくない場合は、Sysinternals Liveフォルダを使用することもできます。これを行うには、ファイルエクスプローラーを開き、\\live.sysinternals.com\toolsを貼り付けます。そうすると、通常のネットワーク共有フォルダのようにSysinternalsのファイルが含まれたフォルダが表示されます。procmonを含むすべてのSysinternalsのファイルが含まれています。

Sysinternals Live

procmonを見つけるまでスクロールダウンし、ダブルクリックして、procmonを実行します。

Procmonの起動動作のカスタマイズ

デフォルトでは、procmonはエンドユーザーライセンス契約(EULA)の承諾を求め、またウィンドウを開きます。コマンドラインを使用することで、このデフォルトの動作をカスタマイズすることができます。

たとえば、/Minimizedスイッチを使用して、procmonを最小化して起動したい場合です。

.\procmon.exe /Minimized

おそらく、新しいマシンでprocmonを実行している場合、EULAのプロンプトを表示したくないかもしれません。その場合、/AcceptEulaスイッチを使用して起動時に無効にすることができます。

.\procmon.exe /AcceptEula

現代ではあまり起こりにくいですが、procmonを起動すると、64ビットまたは32ビットのOSを実行しているかどうかを検出します。64ビットマシンで実行している場合、64ビットプロセスが起動され、逆もまた然りです。64ビットマシンでprocmonを32ビットプロセスとして実行したい場合、または32ビットマシンで生成されたログファイル(後述)を読みたい場合は、/Run32スイッチを使用します。

.\procmon.exe /Run32

Procmonには他にも動作をカスタマイズするためのコマンドラインスイッチがありますが、それについては後のセクションで学ぶことになります。

Procmonの紹介

最初にprocmonを起動すると、オプションが多すぎて困惑するかもしれません。心配しないでください、このガイドではほぼすべてを学ぶことができます!下記は、通常のprocmonキャプチャの進行中を示しています。

Default Procmon process view

procmonを実行すると、Windowsのさまざまなイベントをキャプチャし始めます。

procmonが自動的にイベントのキャプチャを開始しないようにするには、procmon.exe /NoConnectというコマンドをコマンドラインから実行することができます。

上のスクリーンショットで操作列の下に表示されているように、さまざまなアイコンがあります。各アイコンは異なるクラスのWindowsイベントを表しています。Procmonは以下の5つの異なるクラスからイベントをキャプチャします:

  • レジストリ
  • ファイルシステム
  • ネットワーク
  • プロセス
  • プロファイリングイベント

各クラスのすべてのイベントは、7つの列からなるリストペインに表示されます:

  • 時刻 – イベントが発生した時刻。
  • プロセス名 – イベントをトリガーしたプロセスの名前。
  • PID – プロセスの識別子。
  • 操作 – プロセスがファイルを開いたり、レジストリキーの値を変更したりするなど、イベントのタイプ。
  • パス – イベントが対話したオブジェクトのパス(ファイルパス、レジストリパスなど)
  • 結果 – この列には、イベントの結果を示す多くの値が含まれます。この値は、SUCCESSのように単純なものから、REPARSE、BUFFER OVERFLOW、NAME NOT FOUNDなど、イベント固有のものまでさまざまです。
  • 詳細 – この列には、特定のイベントを見つけたら表示される詳細な情報がすべて含まれています。

特定の列を表示したくない場合や、他の列を表示したい場合は、列ヘッダーを右クリックし、列の選択を選択してください。表示可能な列をカスタマイズできるダイアログボックスが表示されます。

Customizing procmon columns

イベントウィンドウで、イベントをダブルクリックします。プロセスやイベント自体に関する詳細情報は、イベントプロセススタックタブで確認できます。

Procmon event properties window

キャプチャの有効化と無効化

キャプチャプロセスを完全に制御できます。キャプチャプロセス全体を無効にするか、イベントクラスごとにキャプチャを無効にすることができます。

上部メニューバーには、虫眼鏡のアイコンが表示されます(下図参照)。虫眼鏡に赤いXが表示されている場合、キャプチャは無効です。それ以外の場合、キャプチャは有効です。

Procmon actively capturing events

必要以上にprocmonがイベントをキャプチャし続けないでください。これにより、すべてのイベントを保存するために仮想メモリが使用され、注意が必要です。さもないと、Windowsがクラッシュする可能性があります。この動作を変更することができますので、後で説明します。

もっと選択的にしたい場合、各イベントクラスのキャプチャを制御することもできます。メニューバーには、操作列に同じアイコンが5つ表示されています。これらのボタンをクリックすると、イベントクラス全体を有効または無効にすることができます。

Types of Windows events

マウスで各アイコンにホバーすると、各アイコンが何のアクティビティを表しているかが表示されます。

アイコンをクリックするとすぐに、procmonがイベントフィルターを適用します。これまでにキャプチャされたイベントの数に応じて、次のようなポップアップが表示される場合があります。

Types of Windows events

デフォルトでは、右端のアイコン(黒と緑のグラフ)は有効になっていません。procmon起動時にこのイベントクラスを有効にしたい場合は、.\procmon.exe /Profilingを使用してコマンドラインからprocmonを起動できます。

ウィンドウの下部を見ることで、イベントの数を確認できます。以下のように、procmonは84,334件のイベントを処理しましたが、適用されたイベントフィルターのためにそのうちの15,912件または18%しか表示されていません。また、これらのイベントが仮想メモリに格納されていることも確認できます(後で詳しく説明します)。

Number of Events in the Window

イベントフィルター

procmonを理解するには、間違いなくイベントフィルターの概念を理解する必要があります。イベントフィルターは、信号とノイズを分離する方法です。上記では、イベントフィルターを整個なイベントクラスに適用しましたが、より詳細に設定することもできます。

イベントフィルターとのやり取り方法は複数あります。まずは簡単な方法から始めましょう。上部のフィルターメニューアイテムをクリックしてください。さまざまなフィルターを操作するオプションが表示されます。

Filter menu options

フィルターの表示

デフォルトでは、procmonはフィルターを作成します。フィルターメニューアイテムの下にあるフィルターをクリックし、フィルター…をクリックしてください。フィルターのルールをフィルタリングするための1つと、設定したすべてのルールを表示するための1つのエリアが表示されます。以下にこれの例を示します。

Filter rules

デフォルトでは、procmonは起動時に上記のフィルターを表示します。このボックスを非表示にするには、/Quietスイッチを使用してprocmonを起動することができます。

自分自身でフィルターを作成しなくても、procmonは組み込みのフィルタールールセットも使用していることがわかります。フィルターボックスで下にスクロールすると、さまざまなタイプのルールが定義されています。ここでは、各カテゴリ、演算子、値、および各ルールに対するアクションを表示できます。

これらのフィルターは、これらのフィルターに除外されるイベントを通常は表示する必要がないため、適用されます。しかし、すべてのデフォルトフィルターを削除するか、フィルターをクリックして高度な出力を有効にするをクリックすると、すべてのイベントを表示できます。

Enable Advanced Output

たとえば、上部にいくつかのルールが表示されています。これらのルールは、「プロセス名」「列」の値に「is」「関係」にはprocmon関連のさまざまなプロセス、「値」の列の値には「アクション」「除外」であることを示しています。簡単に言えば、これらのルールは、例えば「procmon.exe」という名前のプロセスを表示しないようにする(除外する)ということです。

イベントフィルタールールの管理

使用状況に応じて、独自のルールを追加する必要があるでしょう。ルールを追加する方法はいくつかあります。

プロセスモニターフィルターボックスを使用する

前のセクションで、「プロセスモニターフィルター」ボックスの外観を見て、すべてのルールを表示しました。このボックスでは、ルールの作成、変更、削除も行うことができます。

たとえば、「explorer.exe」プロセスがレジストリキーをクエリした時のみ表示したいとします。

イベントフィルターの追加

プロセスモニターフィルターボックスで:

  1. 左端のドロップダウンリストをクリックします。このリストには、フィルタリングすることができるさまざまなイベントのカテゴリが表示されます。以下のようにかなり多くの項目が表示されます。

    このリストに表示される各項目は、以下に示すメインディスプレイに表示される列に対応しています。この記事の目的のために、「プロセス名」を選択します。

Process Monitor Filter

2. カテゴリを選択し、次にオペレータを選択します。デフォルトでは、ドロップダウンボックスはisですが、ドロップダウンをクリックすると他の多くのオプションがあります。これらのオペレータを使用すると、選択したオプションをさまざまな方法でフィルタリングできます。プロセス名がexplorer.exeと完全に一致するプロセスを探しているので、isを選択します。

Operator List

3. 最後に、以下に示すようにプロセス名を選択します。カテゴリとしてプロセス名を選択したので、procmonは自動的に実行中のすべてのプロセスを表示して選択できます。

Process Name in Process Monitor Filter

4. Includeを選択したことを確認してください。なぜなら、この基準に一致するイベントのみを表示したいからです。only。その後、Addボタンをクリックして、現在のフィルタにルールを追加します。以下に示すように、Includeルールは緑のチェックマークとして表示されます。

5. 最後に、explorer.exeがレジストリキーをクエリするすべてのイベントを取得したいので、RegQueryKey操作も含めてください。完了したら、両方のルールが追加されているはずです。

RegQueryKey

6. OKをクリックすると、メインウィンドウが定義したフィルタルールに一致しないすべてのイベントを削除します。

Events that do not match the filter rules

イベントフィルタルールの削除

同様に、フィルタルールを簡単に削除または変更することもできます。

  1. メインウィンドウの上にあるフィルタアイコンをクリックしてプロセスモニターフィルタボックスを開きます。
Process Monitor Filter Box

2. 上記で作成したフィルタールールの両方を強調表示し、以下に示すように削除ボタンをクリックし、OKをクリックします。この操作により、以前に追加されたカスタムルールの両方が削除されます。

remove both of the custom rules added

また、リセットボタンをクリックすると、カスタムフィルタールールをすべて自動的に削除することもできます。

フィルターを適用するたびに、procmonを終了して再び開始すると、そのフィルターが再び適用されます。procmonを開始するときにフィルターが適用されないようにするには、/NoFilterスイッチでprocmonを起動できます。

右クリックでフィルタールールを追加

プロセスを右クリックすると、右クリックメニューからフィルタールールを追加することもできます。以下に示すように、このメニューから直接、どんな種類のルールも作成できます。全くプロセスモニターフィルターボックスに行く必要はありません!

add filter rules via a right-click menu

右クリックメニューを介して作成されたフィルタールールを削除するには、それでもプロセスモニターフィルターボックスに行ってそれらを削除する必要があります。

カスタムフィルターの保存と管理

もしあなたがprocmonのパワーユーザーなら、様々な機会のためにフィルタールールのセットを持つ時が来るかもしれません。procmonのフィルター保存および整理機能を使用して、これらのセットを好きなだけ管理および保存できます。

たくさんのカスタムフィルターを定義しており、それらを再び使用するために保存したいとしましょう。このフィルターを保存するには、フィルターに移動し、フィルターの保存を選択し、以下に示すように名前を提供します。

Saving a filter

フィルターを保存したら、フィルターに移動し、フィルターを整理をクリックして保存したすべてのフィルターが表示されます。 ここから、フィルターをクリックして、OKをクリックして保存したフィルターが現在のウィンドウに適用されます。

Viewing and loading filters

また、フィルターをロードにホバーして、フィルターのドロップダウンから右側のリストから保存したフィルターを選択してロードすることもできます。

Loading a filter

フィルターのインポートとエクスポート

別のコンピューターでprocmonをロードして保存したすべてのフィルターを維持することを期待している場合、残念ながらできません。 Procmonにはフィルターを同期するクラウドサービスがありません。 ただし、フィルターを手動でエクスポートして、後でインポートすることができます。

procmonフィルターをエクスポートするには:

  1. フィルターを整理ボックスに移動します。
  2. すでに保存されていてエクスポートしたいフィルターをクリックします。
  3. エクスポートボタンをクリックします。
  4. 名前を提供し、パスを選択してOKをクリックします。 すべてのprocmonフィルターがPMF拡張子で保存されていることがわかります。

procmonフィルターをインポートするには:

  1. フィルターを整理ボックスに移動します。
  2. インポートボタンをクリックします。
  3. インポートしたいフィルターを見つけて、OKをクリックします。

これらの手順のビジュアルウォークスルーを以下で確認できます。

import procmon filters

Procmon構成のインポートとエクスポート

上記で学んだように、PMFファイルを介してprocmonフィルターをエクスポートおよびインポートすることができます。しかし、フィルターはprocmonインスタンスを構成する要素の一部に過ぎません。列をカスタマイズしたり、保存場所を変更したりすることもできます(後で詳しく説明します)。これらのすべての設定を保存できたらいいですね。実際に保存できます!

procmonの設定全体を保存するには、ファイルをクリックして、設定のエクスポートを選択し、PMCファイル(procmonの設定)を保存したい場所を選択します。

Export Configuration

保存したら、同じコンピューター上で(または異なるコンピューター上で)procmonを閉じて、procmonを開き、ファイルをクリックして、設定のインポートを選択します。すると、procmonはエクスポートしたときと同じフィルターやその他の設定を適用します。

また、コマンドラインを使用して保存された設定(フィルターを含む)を/LoadConfigスイッチとファイルのパスを続けてロードすることもできます。例:./procmon.exe /LoadConfig C:\ProcmonConfigs\file_deletion.pmc。

イベントのハイライトとフィルターへの変換

特定のイベントを見つけやすくする必要があるが、フィルターを使用してイベントを表示から削除したくない場合は、ハイライトを使用できます。ハイライトは、フィルターと同様にルールのセットを構築することができますが、イベントを非表示にするのではなく、イベントの背景色を変更します。

たとえば、イベントリストでctfmon.exeというプロセスを強調表示したい場合、次の手順でハイライトルールを作成できます:

  1. ハイライトしたい属性のイベントを右クリックします。
  2. クリックしてハイライトを選択し、そのイベントの属性をハイライト表示します。この例では、プロセス名を選択します。すると、背景色が薄い青色に変わります。
  3. ハイライトルールが作成されたら、プロセスモニタのハイライト表示ボックスに移動し、フィルタをクリックしてハイライトを選択します。そこにハイライトルールが作成されているのが見えます。
  4. プロセスモニタのハイライト表示ボックスからは、フィルタと同様にルールを追加および削除することができます。
  5. いくつかのハイライトルールを作成し、それらをフィルタに変換したい場合は、フィルタを作成ボタンをプロセスモニタのハイライト表示ボックスでクリックします。

これらの手順のビジュアルウォークスルーを以下で確認できます。

Highlighting Events and Converting to Filters

ログファイルへのイベントのエクスポートおよびオープン

Procmonがイベントをウィンドウに表示するには、どこかに保存する必要があります。デフォルトでは、イベントは仮想メモリ、具体的にはページファイルに保存されます。

events are stored in virtual memory

イベントの保存には、ページファイルのサイズ(およびシステムのコミット制限)によって、procmonが保存できるイベントの数が異なります。

Procmonは最大1億9900万件のイベントをキャプチャできます。

ログファイルへのイベントの保存

これらのイベントを後で調査するために保存する必要があるか、別のコンピュータにロードする必要があるかもしれませんか?その場合、イベントをログファイル(PML)に保存する必要があります。

便利なイベントを保存する方法の一つは、ファイルをクリックして、保存を選択することです。この操作により、以下のファイルに保存のダイアログボックスが表示され、いくつかのオプションが表示されます。

保存するイベント:

  • すべてのイベント– このオプションは、イベントフィルタを適用しているかどうかに関係なく、すべてのイベントを保存します。すべてのキャプチャされたイベントをファイルに保存します。
  • 現在のフィルタで表示されているイベント– このオプションは、現在アクティブなイベントフィルタをクリアしたイベントのみを保存します。すべてのキャプチャされたイベントではありません。
  • ハイライトされたイベント– このオプションは、現在ハイライトされているイベントのみをログにエクスポートします。

形式:

  • Native Process Monitor フォーマット(PML)– すべてのイベントを保存するためのデフォルトの形式(PML)。
  • カンマ区切り値(CSV)– CSV ファイルにすべてのイベントを保存します。
  • 拡張可能マークアップ言語(XML)– すべてのイベントを XML ファイルに保存します。この形式では、トラックトレースを保存することもできます(後で説明します)し、スタックシンボルを解決します。
Events

OKをクリックすると、現在の条件に一致するすべてのキャプチャされたイベントが選択したファイルに保存されます。

保存されたイベントログの開き方

1つのコンピュータで数千のイベントをキャプチャし、そのキャプチャセッションをPMLファイルに保存し、別のコンピュータにコピーして調査することができました。では、次はどうすればよいでしょうか? 開く必要があります。

ローカルコンピュータでキャプチャしたかどうかに関係なく、PMLファイルを開くには、単純にファイル開くに移動し、PMLファイルを選択するだけです。

/OpenLogスイッチを使用してコマンドラインからログを開くこともできます。例:procmon.exe /OpenLog C:\MyLogFile.pml。

イベントの自動ログ記録

前のセクションでは、キャプチャしたイベントをログにエクスポートする方法を学びました。しかし、事前にPML、XML、またはCSVファイルにイベントを保存したい場合はどうでしょうか? procmonを使用して、これらのログファイル形式のいずれかにイベントを自動的にキャプチャすることができます。

また、イベントをページファイルに保存することは、1時間未満の簡単なアドホックなトラブルシューティングセッションに適していますが、いくつかの欠点があります。

  1. procmonを閉じると、イベントが消えてしまいます。
  2. 前述のように、ページファイルのサイズが大きくなる可能性があります。

ストレージ場所として仮想メモリを使用する場合、ファイル→バッキングファイルをクリックして、procmonが使用するスペースの残量を確認できます。

どうすればよいでしょうか? ストレージ場所を変更します。

ディスクにイベントを保存する

ページファイルからイベントを保存する場所をディスクに変更するには、次の手順を実行します。

  1. 現在実行中のキャプチャがある場合は、キャプチャを停止します。

2. ファイルをクリック —> バッキングファイル。そこで、保存されたイベントとサイズの概要が表示され、保存場所を変更するオプションがあります。

Process Monitor Backing Files

3. ファイルに保存場所を変更するには、使用するファイル名: フィールドをクリックし、省略ボタンをクリックしてファイルの場所を定義します。

最適なパフォーマンスのために、procmonが実行されているディスクボリュームとは異なるディスクボリュームを使用してみてください。

procmonをコマンドラインから起動し、/BackingFileスイッチを使用してファイルを保存することもできます。ページファイルに戻りたい場合は、/PagingFileスイッチを使用してください。

ログファイルの変換

Procmonは、PML、CSV、およびXMLの3つの異なる形式でログファイルを保存できます。おそらくPML形式でログファイルを保存し、スクリプトや他のツールでイベントを解析する必要があります。その場合、PMLログファイルをXMLまたはCSVに変換できます。

たとえば、C:\capture.pmlにPMLログファイルがあるとします。このログファイルをXMLとCSVの形式に変換したい場合、まず/OpenLogスイッチを使用してログファイルを開き、/Save*スイッチを使用して保存します。

Procmonには、ログを3つの前述の形式で保存できる標準の/SaveAsパラメータがあります。提供されるファイル拡張子に応じてファイル形式が設定されます。

以下はいくつかの例です:

capture.pmlログをcapture.xmlに変換:

procmon.exe /OpenLog C:\capture.pml /SaveAs C:\capture.xml

capture.pmlログをcapture.csvに変換してください:

procmon.exe /OpenLog C:\capture.pml /SaveAs C:\capture.csv
procmon.exe /OpenLog C:\capture.pml /SaveAs1 C:\capture.xml
procmon.exe /OpenLog C:\capture.pml /SaveAs2 C:\capture.xml

Progress Indicator

ブート時間のログ取得

オプションをクリックして、メニューからブートログの有効化を選択します。

Enabling boot logging

ブートログの有効化をクリックすると、オプションの情報を入力するためのダイアログボックスが表示されます。このダイアログボックスでは、スレッドプロファイリングイベントをキャプチャできます。

スレッドプロファイリングイベントの有効化は高度な使用例です。スレッドプロファイリングを有効にすると、procmonはスレッドスタックトレースとCPU利用率をキャプチャし、CPU関連のパフォーマンスの問題の原因を特定できます。

Optional thread-profiling events for boot time logging

一度OKをクリックすると、procmonはブートロギングを有効にし、フィルタードライバー(後で詳しく説明します)に次のWindowsの再起動を待つように指示します。Windowsを再起動すると、procmonは手動で開始したかのようにプロセスイベントのキャプチャを開始します。

すべてのブート時イベントデータは、一時的なログファイルC:\Windows\procmon.pmbに保存されます。

Windowsが再起動したら、再びprocmonを開きます。以下のようなダイアログボックスが表示されます。ここで、ブート時のデータをPML形式に変換するためにはいをクリックし、その後、データを保存するログファイルを選択します。

Confirmation to convert boot-time events to PML

procmonがデータを変換すると、以下のような進行状況バーが表示されます。

Converting boot-time event data to PML

再起動後に再びprocmonを起動するのを忘れないでください! Procmonは、WindowsがC:\Windows\procmon.pmbで起動するとすぐにイベントのキャプチャを開始します。procmonを再度開いてオフにするまで、それは続行します。

リモートでProcmonを実行する

procmonはWindowsマシン上でローカルにしか実行されませんが、psexecまたはPowerShellのInvoke-Commandコマンドを使用してリモートでprocmonを実行できます。

関連記事: PsExec:究極のガイドInvoke-Command:リモートコードを実行する最良の方法

PowerShellのInvoke-Commandコマンドでprocmonを実行するには、次の手順に従ってください:

  1. リモートマシンでPowerShellリモートを有効にします。

2. PowerShellコンソールを介してprocmonフォルダをリモートコンピュータにコピーします。

Copy-Item -Path C:\procmon \\MYPC\c$

3. PowerShellを介してprocmonを呼び出し、EULA確認をスキップし、procmonにイベントを仮想メモリではなくバッキングファイルに保存するように強制し、開始時にフィルタをプロンプトしないようにします。

Invoke-Command -Computer MYPC -ScriptBlock { C:\procmon\procmon.exe /AcceptEula /BackingFile C:\capture.pml /Quiet }

4. この時点で、procmonのキャプチャが開始されました。キャプチャしようとしている問題を再現してください。

5. リモートコンピュータでprocmonを/Terminateスイッチを使用して停止します。

Invoke-Command -Computer MYPC -ScriptBlock { C:\procmon\procmon.exe /Terminate }

6. procmonがシャットダウンするのを待ちます。ショートカットとして、定期的にprocmonプロセスを確認し、完了したらPowerShellコンソールに制御を戻します。

while (Invoke-Command -Computer MYPC -ScriptBlock { Get-Process procmon -ErrorAction Ignore }) {
     Write-Host "Waiting on procmon to exit…"
     Start-Sleep -Seconds 5
 }

7. リモートログファイルをローカルコンピュータにコピーします。

$session = New-PSSession -ComputerName MYPC
Copy-Item -Path C:\log.pml -Destination C:\ -FromSesson $session
$session | Remove-PSSession

これで、リモートで実行されたログファイルがローカルコンピュータにあります!

このキャプチャを管理するための適切なPowerShellスクリプトが必要な場合は、以下で見つけることができます。

[CmdletBinding()]
 param(
     [Parameter()]
     [string]$ComputerName, 
     [Parameter()]
     [string]$LogFilePath = 'C:\capture.pml'
 )
 $procmonFolderPath = 'C:\procmon'
 try {
     $session = New-PSSession -ComputerName $ComputerName
     Copy-Item -Path $procmonFolderPath -Destination $procmonFolderPath -ToSession $session $scriptBlock = {
         & "$using:procmonFolderPath\procmon.exe" /AcceptEula /BackingFile $using:LogFilePath /Quiet
         & "$using:procmonFolderPath\procmon.exe" /Terminate
         while (Get-Process procmon -ErrorAction Ignore) {
             Write-Host "Waiting on procmon to exit…"
             Start-Sleep -Seconds 5
         }
     }
     Copy-Item -Path $LogFilePath -Destination C:\ -FromSesson $session
 } catch {
     throw $_
 } finally {
     $session | Remove-PSSession
 }

長時間実行されるProcmonキャプチャの設定

A busy Windows system can produce a lot of events procmon captures that can overwhelm your PC. If you intend to run procmon for an extended amount of time, there a few measure you should take into consideration.

フィルタリングされたイベントの削除

Procmonがキャプチャを実行している間、すべてのイベントがキャプチャされます。イベントフィルタを作成して適用できますが、これらのフィルタは画面上のイベントを非表示にするだけであり、procmonがそれらをキャプチャするのを防ぎません。

長時間実行されるprocmonキャプチャを行う意図がある場合は、以下に示すようにフィルタメニューからフィルタされたイベントをドロップを選択するのが常に良い考えです。

Drop Filtered Events

フィルタされたイベントをドロップアイテムを選択すると、procmonはすぐにフィルタされたすべてのイベントをドロップし始めます。Procmonはそれらを画面に表示せず、仮想メモリやログファイルに保存しません。不要なイベントを完全にドロップすることで、リソースを節約できます。

高度なトピック

まだprocmonとその使用方法についてのさらなる情報をお探しですか?では、いくつかの高度なトピックに移りましょう!これらのトピックは、あまり頻繁に必要とされるものではないでしょう。これらのトピックは、より内部的なprocmonの機能に関するものですが、トラブルシューティングに役立つ情報です。

フィルタドライバー

イベントをキャプチャするために、procmonはWindows Filter Manager (FltDrv)を介してフィルタドライバーを登録および使用します。このフィルタドライバーはPROCMON24と呼ばれ、キャプチャを開始するとインストールされます。時々、このフィルタドライバーが他のアプリケーションと競合することがあります。

procmonを起動した後、昇格されたPowerShellコンソールまたはコマンドプロンプトを開き、fltmc filtersを実行します。 fltmcユーティリティはフィルタドライバーを一覧表示し、ロードおよびアンロードします。これを実行すると、以下に示すようにPROCMON24フィルタがロードされているのが見えます。

PROCMON24の高度は、デフォルトで385200です。他のフィルターはより低い番号を持っています。フィルタードライバーの高度は、フィルタードライバーがイベントを「見る」ことができるレベルを表します。たとえば、wcifs、luafv、またはWofレベルで発生するイベントは、procmonが見ることができません。この変更については後で詳しく説明します。

Procmon 24

PROCMON24フィルタードライバーは、procmonが実行されていない場合でもロードされたままです。

時々procmonでフィルタードライバーをロードする際に問題が発生することがあります。トラブルシューティングのために、/NoConnectionスイッチを使用してprocmonを開き、フィルタードライバーへの接続を防止します。

PROCMON24フィルタードライバーのアンロード

PROCMON24フィルタードライバーがさまざまなハードウェアデバイスと競合する場合があり、アンロードする必要があります。ただし、この状況は簡単ではありません。

フィルタードライバーをアンロードするには、fltmc unloadコマンドを使用し、フィルタードライバーの名前を続けます。

fltmc unload PROCMON24

ただし、上記のコマンドを試すとすぐに動作しないことがわかります。このフィルタードライバーをアンロードできないので、おそらく開発者がこの機能を追加しなかったと考えられます。

Can’t Unload the Filter

PROCMON24フィルタードライバーをアンロードする必要がある場合は、残念ながら再起動が唯一の方法です。

スタックトレース

時には、レジストリキーの読み取り、ファイルのオープン、またはネットワークアドレスの呼び出しなどの単純なイベントだけでは十分ではありません。もっと深く掘り下げて、プロセスが呼び出している実際のWindows API関数呼び出しの履歴を見る必要があります。プロセスのスタックトレースを見る必要があります。

A stack trace is the history of various functions called during various function calls when a process is running.

procmonに表示されるイベントのリストで、任意のイベントをダブルクリックし、以下に示すようにスタックタブをクリックします。スタックタブは、イベントが発生した時点で個々のプロセスが呼び出した関数呼び出しを表します。

Stack Tab

スタックトレースのトピックは長くなる可能性があります。プロセスの呼び出しスタックを理解するには、次の記事を参照してください。Process Monitorでより良いスタックトレースを取得する

Procmonのアルティチュードの変更(より低レベルのイベントのキャプチャ)

前述のように、procmonはイベントをキャプチャするためにフィルタードライバを使用しています。procmonはすべてのWindowsイベントをキャプチャしているように見えるかもしれませんが(procmonウィンドウに表示されるイベントは非常に多いです!)、実際にはそうではありません。Procmonは、フィルタードライバが認識しているイベントまたはフィルタードライバのアルティチュードに関連するイベントのみをキャプチャします。

たとえば、ウイルス対策のアクティビティ、低レベルのストレージ、およびその他の低レベルのハードウェアイベントを記録する必要がある場合、PROCMON24フィルタードライバのアルティチュードを他のドライバよりも低くする必要があります。

そのためには、以下の手順を実行します。

  1. Procmonを閉じてください。

2. 現在ロードされているフィルタドライバーの最低高度をfltmcコマンドで見つけます。

fltmc filter

3. レジストリキーHKLM\System\CurrentControlSet\Services\PROCMON24\Instances\Process Monitor 24 InstanceのAltitudeレジストリ値を、最低高度値より100低く変更してください(すべてのイベントを見るため)。

インストールされているprocmonのバージョンによってレジストリキーの場所が変わることがあります。このチュートリアルではProcmon 2.4を使用しています。

管理者権限のPowerShellセッションを開いて、以下のコードスニペットを実行することで、値を素早く変更できます。

Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Services\PROCMON24\Instances\Process Monitor 24 Instance' -Name 'Altitude' -Value 40400

高度を下げれば下げるほど、管理するイベントが多くなります。必要以上に高度を下げないでください。

4. DeleteおよびSet Valueの権利をEveryoneからProcess Monitor 24 Instanceキーに対して拒否します。procmonが再び実行されると、Altitude値をデフォルトに戻そうとします。これらの権限はregeditユーティリティを使って変更するか、以下のPowerShellスニペットを実行してください。

$regKeyPath = 'HKLM:\System\CurrentControlSet\Services\PROCMON24\Instances\Process Monitor 24 Instance'
$acl = Get-Acl $regKeyPath
$idRef = System.Security.Principal.NTAccount
$regRights = @([System.Security.AccessControl.RegistryRights]::Delete,[System.Security.AccessControl.RegistryRights]::SetValue) 
$inhFlags = [System.Security.AccessControl.InheritanceFlags]::None
$prFlags = [System.Security.AccessControl.PropagationFlags]::None
$acType = [System.Security.AccessControl.AccessControlType]::Deny
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType) 
$acl.SetAccessRule($rule) $acl | Set-Acl -Path $regKeyPath

5. Windowsを再起動してPROCMON24フィルタドライバーをアンロードします。

6. procmonを起動します。

7. PowerShellコンソールまたはコマンドプロンプトを開いてfltmc filtersを実行します。これで、新しい高度でprocmonフィルタドライバーが表示されるはずです。

PowerShell console or command prompt

あなたは今、必要なものをすべてキャプチャできます。 procmonのAltitudeを最低限に抑えれば、モンスーンのイベントに備えることができます。

リアルワールドの例

今、procmonが何ができるか、そしてWindowsイベントを追跡するのにどのように役立つかについて理解しているはずです。この知識を活かし、この種のノウハウが必要な一般的な使用事例をいくつかカバーしましょう。

ファイルを削除しているのは何かを見つける

Windowsマシンにあるファイルが何らかの未知の理由で繰り返し削除される場合、それを追跡したいと思うかもしれません。 procmonが助けてくれます(そしてかなり簡単です)。

おそらくprocmonを開いて、DeleteまたはRemoveというイベントファイルを設定しようとしましたが、残念ながらそのような操作は存在しませんでした。その代わりに、ファイルの削除イベントを見つけるには、Operationが次のいずれかであるイベントをフィルタリングする必要があります:

  • SetDispositionInformationFile
  • SetDispositionInformationEx

システムが多くのファイルを削除している場合は、ファイル削除イベントをファイル名またはパスで絞り込むためにPathフィルターも使用する必要があります。

Operation is          SetDispositionInformationEx   Include
Operation is          SetDispositionInformationFile Include
Path      begins with C:\MyFolder                   Include

ロックされたファイルの問題を追跡する

私たちは皆、そこにいたことがあります。ファイルを移動または削除しようとすると、他のプロセスによってロックされていることがあります。たとえばアプリケーションをアンインストールしようとしている場合、たとえば、最初のランダムなエラーがロックされたファイルと何か関係があるかどうかはわかりません!

Windowsがロックされたファイルを削除または変更しようとするときを特定するには、以下のフィルターセットを使用してください。

Operation is CreateFile        Include
Result    is SHARING VIOLATION Include

アドミン権限が必要なアプリケーションのトラブルシューティング

ドキュメントによると動作するはずのアプリケーションで問題が発生していますか?私たちもそういう経験あります。時には、アプリケーションが生成するプロセスの中に、昇格された権限が必要なものがあるが、どこでそれが必要であるか、どのようにそれが必要であるかを教えてくれないことがあります。そんなときは、procmonを起動して助けを求めることができます。

必要な昇格された権限によって拒否されたプロセスを追跡する方法の一つは、イベントの結果でフィルタリングすることです。

昇格された権限が不足しているために拒否されるイベントが発生するたびに、通常はACCESS DENIEDという結果が表示されます。これを知っていれば、以下に示すように、ACCESS DENIED結果を持つすべてのイベントを表示するシンプルなフィルタを簡単に作成できます。

Result is ACCESS DENIED Include

ここから、パス属性を持つレジストリまたはフォルダーパスなど、さらにフィルタを追加できます。

IPアドレスにアクセスしているプロセスの検出

Wiresharkで奇妙なネットワーク動作がある場合、どのプロセスがその通信を開始しているかを特定する必要があります。プロコンを起動し、以下のフィルタルールセットを追加します。

これらのフィルタルールは、ローカルから開始されたネットワークトラフィックのイベントを、単一のIPアドレスへの宛先に制限します。

Operation   is       TCP Send        Include
Operation   is       UDP Send        Include
Path        contains ->  Include
Event Class is       Network         Include

遅い起動のトラブルシューティング

Windowsの起動が遅いことがあります。その遅さは、多くの異なるWindowsコンポーネント、インストールされたアプリケーションなどによって引き起こされる可能性があります。procmonの起動ログ記録機能を使用すると、問題を特定して修正することができます。

  1. ブートログを有効にします。これは、上記のBoot-Time Eventsのキャプチャセクションで方法を確認できます。

2. Boot Loggingの有効化ダイアログボックスで、スレッドプロファイリングイベントの生成チェックボックスを確認してください。 毎秒のラジオボタンが十分です。

Enabling thread profiling events on boot

3. 再起動後、procmonを開き、任意の列を右クリックし、列の選択を選択します。

4. Process Monitor Column Selectionボックスで、Durationをチェックします。これを行うと、各イベントの実行にかかった時間が表示されます。

Process Monitor Column

5. これで、Durationに適切な秒数のフィルタールールを作成できます。以下のフィルタールールは、5秒以上かかったイベントのみを表示します。

filter rule on Duration

6. 最後に、これらの遅いイベントを調査するために、procmonのProcess Treeを使用すると便利です。 Process Treeは親プロセスと子プロセスの関係を表示し、各プロセスの開始時刻と終了時刻を含んでいます。これを見つけるには、ツールをクリックしてProcess Treeを選択します。

Process Tree

7. Process Treeに入ると、グラフィカルな形式で各プロセスの所要時間が表示されるLife Time列を確認します。また、この表示では、開始時刻終了時刻の列を比較することで時間の経過を確認することもできます。

Lifetime Column

App-Vアプリケーションのトラブルシューティング

多くの組織がMicrosoftのApp-Vサービスを使用してアプリケーションを仮想化し、エンドユーザーに展開しています。App-Vを使用する場合、覚えておくと便利な(かつ未公開の)procmonスイッチがあります。それは/externalcaptureと呼ばれ、

App-Vアプリケーションの周りのレジストリアクティビティをよりキャプチャする傾向があります。.\procmon.exe /ExternalCaptureを使用して、App-Vアプリケーションのトラブルシューティング時に求めている情報が見つからない場合は、このスイッチを試してみてください。

/HookRegistryスイッチは、/ExternalCaptureと同じ目的に役立つと言われていますが、64ビットマシンではもはや機能しないようです。

まとめ

以上が、すべてのprocmonに関する詳細なガイドです!procmonについて多くを学びましたが、この便利なユーティリティでまだ発見すべき素晴らしい機能がたくさんあります。

この究極のガイドに更新や変更の提案があれば、どうぞ私に連絡してください。Twitterでお知らせいただければ幸いです。

Source:
https://adamtheautomator.com/procmon/