Procmon 终极指南

Procmon。臭名昭著的Windows Sysinternals工具,用于追踪各种Windows活动。以其追踪恶意软件安装程序对注册表键进行未知更改或检查病毒痕迹而闻名。

如果您需要检查Windows注册表、文件系统、进程或网络活动,并决定使用procmon,那么这篇文章适合您。

在这个终极指南中,您将学到有关使用procmon工具的一切,从安装、基本用法到各种用例,帮助您追踪各种活动。

先决条件

这个终极指南适用于几乎所有的Windows系统,但出于完整性考虑(以及防止您尝试在Windows 3.1计算机上运行procmon),您需要以下内容:

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

就是这样!您将在以下部分下载并安装procmon。本指南将在Windows 10 Build 1909 x64机器上使用v3.6的procmon。

下载并运行Procmon

首先,您需要在Windows计算机上运行procmon。您可以通过传统的下载方法或Windows Sysinternals称为Sysinternals live来获取它。

老式方式

Procmon不需要安装; 它是一个单一的可执行文件。您可以通过下载ZIP文件来获得它。一旦您下载了它,请使用您喜欢的工具提取ZIP文件。如果您将其保存到家目录,下面是一段PowerShell代码片段。此代码片段将在~\ProcessMonitor中创建一个文件夹,其中包含所有所需的文件。

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

~\ProcessMonitor文件夹中,您将看到五个文件:

  • Eula.txt ——您在运行procmon之前必须接受的许可协议。
  • procmon.chm ——包含所有提供的文档的帮助文件。
  • Procmon.exe ——将启动正确的procmon实例(x86或x64)的主要EXE。
  • Procmon64.exe ——x64 procmon二进制文件。
  • Procmon64a.exe ——alpha 64 procmon二进制文件。

现在通过调用~\ProcessMonitor\procmon.exe文件运行procmon。

Procmon只能以提升的权限运行,因此在运行时,如果您启用了UAC,将提示您接受此权限。有一种解决方法可以绕过这个问题,这将在本指南后面进行介绍。

Sysinternals Live

如果您宁愿不下载(或不能下载)一个EXE文件,您也可以使用Sysinternals Live文件夹。要做到这一点,请打开文件资源管理器并粘贴\\live.sysinternals.com\tools。然后,您将看到一个类似于任何网络共享的文件夹,其中包含所有Sysinternals文件,包括procmon。

Sysinternals Live

向下滚动,直到找到procmon,双击,您就运行procmon了!

自定义Procmon启动行为

默认情况下,procmon启动时会提示您接受最终用户许可协议(EULA),并打开一个窗口。通过使用命令行,您可以自定义此默认行为。

例如,如果您想使用/Minimized开关启动procmon并使其最小化。

.\procmon.exe /Minimized

也许您正在新机器上运行procmon,宁愿不看到EULA提示。您可以使用/AcceptEula开关在启动时禁用它。

.\procmon.exe /AcceptEula

虽然在当今这个时代可能性较小,但每当启动procmon时,它会检测您是否运行在64位或32位操作系统上。如果您在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捕获来自五个不同类别的事件:

  • 注册表
  • 文件系统
  • 网络
  • 进程
  • 分析事件

所有类别中的每个事件都在七列的单个列表窗格中表示:

  • 时间 – 事件发生的时间。
  • 进程名称 – 触发事件的进程名称。
  • PID – 进程标识符。
  • 操作 – 事件的类型,比如进程是否打开了文件,更改了注册表键值等。
  • 路径 – 事件与之交互的对象的路径,比如文件路径,注册表路径等。
  • 结果 – 此列将包含许多值,以指示事件的结果。此值可以是简单的成功(SUCCESS),也可以是特定于事件的,如重新解析(REPARSE),缓冲区溢出(BUFFER OVERFLOW),未找到名称(NAME NOT FOUND)等。
  • 详细信息 – 此列包含一旦您锁定要查看的事件时所需的所有细节。

如果您不想看到某个列,或者想查看其他可用的列,右键单击任何列标题,然后选择选择列。您将看到一个对话框,可以自定义可视列。

Customizing procmon columns

在事件窗口中,双击一个事件。通过查看事件进程堆栈选项卡,您可以找到有关过程和事件本身的更多详细信息。

Procmon event properties window

启用和禁用捕获

您对捕获过程拥有完全控制权。您可以禁用整个捕获过程,或者按事件类禁用捕获。

在顶部菜单栏中,您会看到一个放大镜图标(如下图)。如果放大镜上有一个红色的X,则表示捕获已禁用。否则,捕获已启用。

Procmon actively capturing events

不要让procmon捕获事件的时间超过所需时间。它使用虚拟内存来存储所有这些事件,如果不小心,可能会导致Windows崩溃!稍后您将看到,您可以更改此行为。

如果你更愿意更有选择性,你也可以控制每个事件类的捕获。在菜单栏中,您会看到五个相同的图标显示在操作列中。通过单击这些按钮,您可以启用和禁用整个事件类。

Types of Windows events

将鼠标悬停在每个图标上,以查看每个图标代表的活动类型。

您会发现,只要您单击一个图标,procmon 就会应用一个事件过滤器。根据到目前为止捕获的事件数量,您可能会看到类似于下面的弹出窗口。

Types of Windows events

默认情况下,最右侧的图标(黑色和绿色的图形)未启用。如果您希望在 procmon 启动时启用此事件类,可以使用命令行调用 procmon,如.\procmon.exe /Profiling

您可以通过查看底部的窗口中的事件数量来查看。正如您下面所看到的,procmon 处理了 84,334 个事件,但由于应用了事件过滤器,它只显示了其中的 15,912 个,或者占其中的 18%。您还可以看到这些事件正在存储在虚拟内存中(稍后会详细介绍)。

Number of Events in the Window

事件过滤器

要理解 procmon,您无疑需要了解事件过滤器的概念。事件过滤器是您将信号与噪音分开的方式。事件过滤器隐藏了您不感兴趣的所有事件。在上面,您通过整个事件类应用了事件过滤器,但您也可以变得更加细致。

有多种方式与事件筛选器进行交互。让我们从简单的开始。点击顶部的筛选菜单项。您会看到许多不同的选项来处理筛选器。

Filter menu options

查看筛选器

默认情况下,procmon会为您创建一个筛选器。在筛选菜单项下,点击筛选…。您会看到一个进程监视器筛选器框弹出,其中有两个区域;一个用于过滤您的筛选规则,另一个用于查看您设置的所有规则。您可以在下面看到一个示例。

Filter rules

默认情况下,启动procmon时会显示上述筛选器。如果您想隐藏此框,可以通过使用/Quiet开关启动procmon来实现。

您会发现,即使没有创建任何自定义筛选器,procmon也会使用内置的一组筛选规则。如果您在进程监视器筛选器框中向下滚动,您会看到许多不同类型的规则定义。在这里,您可以查看每个类别、操作员、值和对每个规则采取的操作。

这些筛选器被应用,因为您通常不需要看到这些筛选器排除的事件。但是,如果您想要查看所有事件,您也可以删除所有默认筛选器或点击筛选 —> 启用高级输出,如下所示。

Enable Advanced Output

例如,你会看到一些规则,顶部显示了进程名称对应于的值,对应于关系,与列的值相关的各种procmon进程,以及一个操作排除。简单来说,这些规则告诉procmon不显示(排除)名称为procmon.exe的进程,例如。

管理事件过滤规则

根据您的使用情况,您肯定需要添加自己的规则。有几种不同的方法可以添加规则。

使用进程监视器过滤框

在上一节中,您看到了进程监视器过滤框的样子,并查看了所有规则。在这个框中,您也可以创建、修改和删除规则。

假设您只想看到explorer.exe进程查询注册表键时的时间。

添加事件过滤器

进程监视器过滤框中:

  1. 点击最左边的下拉列表。该列表显示了您可以进行过滤的各种事件类别。如下所示,您可以看到有很多选项!

    您在此列表中看到的每个项目都对应于主显示中显示的一列,如下所示。为了本文的目的,选择进程名称

Process Monitor Filter

2. 选择一个类别,然后选择一个操作符。默认情况下,下拉框将是,但如果你点击下拉框,你还有很多其他选项。这些操作符允许你以多种不同的方式过滤你选择的任何选项。由于你正在寻找一个确切的进程,即explorer.exe,选择

Operator List

3. 最后,按照下面显示的进程名称进行选择。你会注意到,由于你选择了进程名称作为类别,procmon会自动显示出所有当前正在运行的进程供你选择。

Process Name in Process Monitor Filter

4. 确保你已经选择了包括,因为你想看到与此标准匹配的事件。然后点击添加按钮将规则添加到你当前的过滤器中。你可以看到下面,包括规则显示为绿色的勾号。

5. 最后,由于你想要所有explorer.exe查询注册表键的事件,确保也包括RegQueryKey操作。完成后,你应该会看到两个规则都被添加了。

RegQueryKey

6. 点击确定,然后你会看到主窗口删除所有不符合你刚刚定义的过滤规则的事件。

Events that do not match the filter rules

移除事件过滤规则

你也可以轻松地移除和更改过滤规则。

  1. 点击主窗口顶部的过滤图标以打开进程监视器过滤器框。
Process Monitor Filter Box

2. 高亮显示上面创建的两个过滤规则,如下图所示点击删除按钮,然后点击确定。此操作将删除之前添加的两个自定义规则。

remove both of the custom rules added

您也可以点击重置按钮,自动删除所有自定义过滤规则。

每当应用过滤器后退出 procmon 并重新启动它,该过滤器将再次应用。如果您希望在启动 procmon 时确保没有应用任何过滤器,您可以使用/NoFilter开关调用 procmon。

通过右键添加过滤规则

您还可以通过右键菜单添加过滤规则,只需右键单击进程即可。如下图所示,您可以直接从此菜单创建任何类型的规则;无需访问Process Monitor Filter框!

add filter rules via a right-click menu

要删除通过右键菜单创建的过滤规则,您仍然需要转到Process Monitor Filter框进行删除。

保存和管理自定义过滤器

如果您是 procmon 的高级用户,可能会有一段时间您会有各种场合的过滤规则集。使用 procmon 的过滤器保存和组织功能,您可以管理和保存任意数量的这些集合。

假设您已经定义了一堆自定义过滤器,并且希望将它们保存以便以后使用。您可以通过转到过滤器,选择保存过滤器并提供一个名称来保存此过滤器,如下图所示。

Saving a filter

一旦保存了过滤器,您可以转到过滤器,点击整理过滤器,然后您将看到您保存的所有过滤器。在这里,您可以点击一个过滤器,点击确定,您保存的过滤器将应用于当前窗口。

Viewing and loading filters

您还可以通过悬停在加载过滤器上并从右侧的列表中选择您保存的过滤器来加载已保存的过滤器。

Loading a filter

导入和导出过滤器

如果您希望在另一台计算机上加载 procmon 并保留所有保存的过滤器,那就太遗憾了。Procmon 没有云服务来同步过滤器。但是,您可以手动导出过滤器,然后稍后导入它们。

要导出 procmon 过滤器:

  1. 转到整理过滤器框。
  2. 点击您已保存并希望导出的过滤器。
  3. 点击导出按钮。
  4. 提供一个名称,选择一个路径,然后点击确定。您会看到所有 procmon 过滤器都以 PMF 扩展名保存。

要导入 procmon 过滤器:

  1. 转到整理过滤器框。
  2. 点击导入按钮。
  3. 找到您想要导入的过滤器,然后点击确定

您可以在下面看到这些步骤的视觉演示。

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.99 亿个事件。

将事件保存到日志文件

也许你需要将这些事件保存以便以后调查,或者在另一台计算机上加载?在这种情况下,你需要将事件保存到一个日志文件(PML)。

保存这些方便的事件的一种方法是单击文件 —> 保存。此操作将打开下面的保存到文件对话框,其中您将看到一些选项。

要保存的事件:

  • 所有事件 – 此选项就是它看起来的样子。它将保存所有事件,无论您是否对事件应用了筛选器,都将它们保存到一个文件中。
  • 使用当前筛选器显示的事件 – 此选项不保存所有捕获的事件,而只保存通过当前激活的事件筛选器的事件。
  • 突出显示的事件 – 此选项仅导出您当前突出显示的事件到日志中。

格式:

  • 本机进程监视器格式(PML) – 将所有事件保存为(PML)的默认格式。
  • 逗号分隔值(CSV) – 将所有事件保存在CSV文件中。
  • 可扩展标记语言(XML) – 将所有事件保存在XML文件中。此格式还允许您保存跟踪跟踪(稍后详细介绍),并将解析堆栈符号。
Events

单击确定,procmon将提交所有符合您条件的当前捕获事件到您选择的文件中。

打开保存的事件日志

你在一台计算机上捕获了数千个事件,并将捕获会话保存到了一个 PML 文件中,然后将其复制到另一台计算机进行调查。现在怎么办?你需要打开它。

你可以打开任何 PML 文件,无论你是在本地计算机上捕获的还是其他地方,只需简单地转到文件 ——> 打开,然后选择该 PML 文件。

你可以使用命令行打开日志,使用 /OpenLog 开关,例如 procmon.exe /OpenLog C:\MyLogFile.pml。

自动记录事件

在前一部分,你学会了在捕获事件后将其导出到日志中。但是如果你事先知道你想要的事件要保存到 PML、XML 或 CSV 文件中怎么办?你可以让 procmon 自动将事件捕获到其中一个日志文件格式中。

此外,如果你只是进行简单的临时故障排除,可能不到一个小时,将事件存储在页面文件中是可以的。但这种方法也有一些缺点。

  1. 每次关闭 procmon 时,事件都会消失。
  2. 如前所述,你的页面文件大小可能会失控。

当将虚拟内存用作存储位置时,你可以通过点击文件 ——> 后备文件来发现 procmon 还有多少空间可用。

怎么办?更改存储位置。

将事件存储在磁盘上

你可以通过以下方式将 procmon 存储事件的位置从页面文件更改为磁盘:

  1. 如果你正在运行捕获,请停止捕获。

2. 点击文件 ——> 备份文件。然后您将看到存储的事件摘要和大小以及更改存储位置的选项。

Process Monitor Backing Files

3. 要将存储位置更改为文件,请单击使用命名文件:字段,单击省略号按钮并定义文件位置。

尽量使用与procmon运行在不同的磁盘卷以获得最佳性能。

您还可以通过从命令行启动并使用/BackingFile开关来强制procmon使用文件作为存储位置。如果您希望切换回再次使用页面文件,请使用/PagingFile开关。

转换日志文件

Procmon可以以三种不同的格式保存日志文件;PML、CSV和XML。也许您已将日志文件保存为PML并且需要使用脚本或其他工具解析事件。在这种情况下,您可以在命令行中将该PML日志文件转换为XML或CSV。

假设您有一个位于C:\capture.pml的PML日志文件。您想将此日志文件转换为XML和CSV格式的文件。您可以首先使用/OpenLog开关打开日志文件,然后使用/Save*开关来保存它。

Procmon有一个标准的/SaveAs参数,允许您以前述三种格式中的任何一种保存日志。/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

记住在上面的保存到文件对话框中的堆栈跟踪和堆栈符号解析选项吗?您也可以使用/SaveAs1/SaveAs2启用这些选项。

您只能以 XML 格式保存堆栈跟踪和符号信息。

capture.pml日志转换为包含堆栈信息的capture.xml:

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

capture.pml日志转换为包含符号的capture.xml:

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

请注意,添加堆栈跟踪和符号将显著增加转换时间,您将无疑看到如下所示的进度指示器。

Progress Indicator

捕获引导时事件

有时,您需要调查的信息不是在 Windows 正在运行时生成的。您可能还需要在 Windows 启动时调查进程的操作。

通常需要解决诸如启动速度慢或恶意软件决定在 Windows 启动时立即运行的问题。Procmon 有一个名为引导时间记录的特色调用,您可以启用以捕获此信息。

要启用引导记录,请单击选项 —> 启用引导记录,如下图所示。

Enabling boot logging

一旦您单击启用引导记录,您将看到一个弹出的对话框,要求提供一些可选信息。此对话框是您可以捕获线程分析事件的地方。

启用线程分析事件是一个高级用例。当您启用线程分析时,procmon会捕获线程堆栈跟踪和CPU利用率,您可以使用这些信息来识别与CPU性能问题相关的源。

Optional thread-profiling events for boot time logging

一旦您单击确定,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本地运行,但您可以通过调用 procmon来远程运行,使用psexec或PowerShell的Invoke-Command命令。

相关: PsExec:终极指南Invoke-Command:运行远程代码的最佳方式

为了使用PowerShell的`Invoke-Command`命令运行procmon,请按照以下步骤进行:

  1. 如果尚未启用,请在远程计算机上启用PowerShell Remoting

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. 使用/Terminate开关在远程计算机上停止procmon。

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 时,这些信息可能会有所帮助。

过滤驱动程序

为了捕获事件,procmon 注册并使用一个通过 Windows 过滤管理器(FltDrv)过滤驱动程序。这个过滤驱动程序在启动捕获时被安装,称为 PROCMON24。有时,这个过滤驱动程序可能与其他应用程序冲突。

启动 procmon 后,打开一个提升权限的 PowerShell 控制台或命令提示符,然后运行 fltmc filtersfltmc 实用程序会列出、加载和卸载过滤驱动程序。当您运行此命令时,您将看到已加载的 PROCMON24 过滤器,如下所示。

通知 PROCMON24Altitude 默认为 385200,而其他过滤器的默认值更低。过滤器驱动器的高度代表了过滤器驱动器可以“看到”事件的级别。例如,发生在 wcifs、luafv 或 Wof 等级的事件,procmon 将无法看到。稍后将详细说明如何更改此设置。

Procmon 24

即使 procmon 未运行,PROCMON24 过滤器驱动器仍然加载。

有时 procmon 可能在加载过滤器驱动器时出现问题。要进行故障排除,请使用 /NoConnection 开关打开 procmon,以防止 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

堆栈跟踪的主题可以讨论很长时间。如果您想了解更多关于理解进程调用堆栈的信息,请查看文章在进程监视器中获取更好的堆栈跟踪

更改Procmon的高度(捕获较低级别的事件)

如前所述,procmon使用过滤驱动程序来捕获事件。即使在procmon窗口中显示了许多事件(!),它也没有捕获每个 Windows事件。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. 在 Process Monitor 24 Instance 键上拒绝删除设置值权限Everyone。当 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并尝试设置一个名为DeleteRemove文件的事件,但令你沮丧的是,并没有这样的操作存在。相反,要查找文件删除事件,你必须筛选出具有以下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 来帮助解决问题。

追踪由于需要提升的权限而被拒绝的进程的一种方法是根据事件的Result进行筛选。

每当由于缺乏提升的权限而被拒绝的事件发生时,通常会看到ACCESS DENIED的结果。知道了这一点,您可以轻松构建一个简单的过滤器,显示所有具有ResultACCESS DENIED的事件,如下所示。

Result is ACCESS DENIED Include

从这里开始,您还可以添加更多的过滤器,比如带有Path属性的注册表或文件夹路径。

查找访问 IP 地址的进程

也许您遇到了一些奇怪的网络行为,使用Wireshark需要找出哪个进程发起了该通信。启动 procon 并添加以下一组过滤规则。

这些过滤规则将事件限制为仅限于本地发起的目标为单个 IP 地址的网络流量。

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

故障排除启动缓慢

有时 Windows 启动缓慢。这种缓慢可能是由许多不同的 Windows 组件、安装的应用程序等引起的。使用 procmon 的引导日志记录功能,您可以追踪并解决问题。

  1. 启用启动日志记录。您可以在上面的捕获启动时间事件部分找到如何执行此操作。

2. 在启用启动日志记录对话框中,请确保选中生成线程分析事件复选框。选择每秒单选按钮应该就足够了。

Enabling thread profiling events on boot

3. 重新启动后,打开 procmon,右键单击任何列,然后选择选择列

4. 在进程监视器列选择对话框中,勾选持续时间。这样做后,您将能够看到每个事件执行所花费的时间。

Process Monitor Column

5. 现在,您可以根据持续时间创建一个过滤器规则,以确定可能合适的秒数。下面的过滤器规则将只显示执行时间超过五秒的事件。

filter rule on Duration

6. 最后,另一种有用的调查这些慢事件的方法是使用 procmon 的进程树进程树显示父进程和子进程之间的关系,并包含每个进程的开始和结束时间。要找到它,请单击工具 —> 进程树

Process Tree

7. 进入进程树后,现在看一下以图形格式显示的生存时间列,该列显示每个进程花费的时间长度。您还可以通过比较此视图中的开始时间结束时间列来注意时间跨度。

Lifetime Column

调试 App-V 应用程序

许多组织使用 Microsoft 的 App-V 服务 对应用程序进行虚拟化并部署给最终用户。如果您使用 App-V,有一个方便(且未记录的)的 procmon 开关,您需要知道,它被称为 /externalcapture

使用 .\procmon.exe /ExternalCapture 往往可以捕获与 App-V 应用程序相关的更多注册表活动。如果在故障排除 App-V 应用程序时找不到您要找的内容,请尝试使用此开关!

/HookRegistry 开关据说具有与 /ExternalCapture 相同的作用,但在64位计算机上不再起作用。

总结

好了,你看到了;关于 procmon 的一份详尽的指南!虽然您已经学到了很多关于 procmon 的知识,但使用这个方便的实用程序仍然有更多宝藏等待发掘。

如果您想提出对这个终极指南的任何更新或更改的建议,请通过 Twitter 联系我并让我知道!

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