6. 信息概要工具(Trace Summary Tools)
1.介绍
Process Monitor
Copyright ©1996-2010 Mark Russinovich and Bryce Cogswell
Sysinternals - www.sysinternals.com
Process Monitor 是windows下高级实时监听工具,用于监视文件系统、注册表、进程和线程的活动。它兼并了两个Sysinternals实用工具Filemon和Regmon的特点,并且增加了一系列的扩展包括丰富而无干扰的过滤全面的事件属性比如会话ID和用户名,可靠的进程信息,全部的线程栈和对每一个操作完整的符号支持,同时一个或多个文件。这些优秀的功能将使Process Monitor成为解决操作系统问题和恶意软件跟踪的重要工具之一。
Process Monitor运行在Windows XP SP2,、Windows Server 2003 SP1、和Windows Vista。同时支持64位版本的Windows XP, Windows Server 2003 和 Windows Vista。
2.使用Process Monitor
运行Process Monitor 需要本地管理组成员。当你启动Process Monitor后,它就开始监听三类操作,包括:文件系统,注册表,进程。
- 文件系统
Process Monitor显示所有的Windows文件系统活动,包括本地磁盘和远程文件系统。Process Monitor会自动探测到新的文件系统设备并监听它们。所有的系统路径都会被显示为相对于在用户会话中的一个文件系统操作的执行。比如,如果用户A把挂载的一个共享作为Z:盘符,则在Process Monitor中,所有对这个共享的操作都会被显示为相对于驱动器Z:。想在列表中清除文件系统的操作,在Process Monitor工具栏上反选“文件系统”按钮,再次按下可以增加对文件系统的监听。 - 注册表
Process Monitor记录所有的注册表操作并显示使用常见的注册表根键缩写来显示注册表路径(如HEKY_LOCAL_MACHINE 缩写为HKLM)。想在列表中清除注册表的操作,在Process Monitor工具栏上反选“注册表”按钮,再次按下可以增加对注册表的监听。 - 进程
在它的进程/线程监听子系统中Process Monitor跟踪所有进程和线程的创建和退出操作,包括DLL和设备驱动程序的加载操作。 想在列表中清除进程的操作,在Process Monitor工具栏上反选“进程”按钮,再次按下可以增加对进程的监听。 - 网络
Process Monitor使用“Windows事件跟踪(ETW)”来跟踪并记录TCP和UDP活动。每个网络操作包括源和目标地址,还有发送和接受到的一些数量的数据,但不包括真实的数据。想在列表中清除网络的操作,在Process Monitor工具栏上反选“网络”按钮,再次按下可以增加对网络的监听。 - 性能分析
这个事件类可以在“选项”菜单中启用。当处于“启用”状态,Process Monitor扫描系统中所有活动的线程并为每个线程生成一个性能分析事件,记录了内核模式和用户模式的CPU时间消耗,还有许多在上个性能分析事件后已被线程执行的环境开关。
提示:性能分析中不包括系统进程
有许多基础设置控制ProcessMonitor的基本操作:
Capture:通过“File”菜单下“Capture Events”菜单项,capture工具栏按钮或Crtl+E热键可以开关Process Monitor的监听。
Autoscroll:通过“Edit”菜单下Autoscroll菜单项,autoscroll工具栏按钮或Ctrl+A热键来开关Process Monitor的自动滚动动作,这样最近的操作就会始终显示着。
Clear:通过“Edit”菜单选择Clear Display或用Ctrl+X热键来清除所有显示项。
3.列的选择
你可以拖拽列来重新排列次序,也可以在Options菜单中选择Select Columns选项,然后通过弹出的列选择对话框来定制列的显示。
Application Details
- Process Name 产生事件的那个进程的名字
- Image Path 进程镜像的完整路径
- Command Line 命令行,用于启动进程
- Company Name 进程镜像文件中的企业名称。这个文本是由应用程序的开发者来定义的。
- Description 进程镜像文件中的产品描述信息。这个文本是由应用程序的开发者定义的。
- Version 进程镜像文件中的产品版本号。这个文本是由应用程序的开发者定义的。
Event Details
- Sequence Number 操作在全体事件中的相对位置,也包括当前的过滤。
- Event Class 事件的类别(文件,注册表,进程)
- Operation 特殊事件操作,比如Read,RegQueryValue等等
- Date & Time 操作的日期和时间
- Time of Day 只是操作的时间
- Path 一个事件引用资源的路径
- Detail 事件的附加信息
- Result 一个完成了的操作的状态码
- Relative Time 一个操作相对于Process Monitor的启动后的时间,或者相对于Process Monitor的信息清除后的时间。
- Duration 一个已经完成了的操作所持续的时间
Process Management
- User Name 正在执行操作的进程的用户账户名
- Session ID 正在执行操作的进程的Windows会话ID
- Authentication ID 正在执行操作的进程的登录会话ID
- Process ID 执行了操作的进程的进程ID
- Thread ID 执行了操作的线程的线程ID
- Integrity Level 正在运行的进程执行操作时的可信级别(仅支持Vista以上系统)
- Virtualized 执行了操作的进程的虚拟化状态
4.事件属性
你可以双击单个事件来查看它的属性内容,或者当右击属性的时候选择属性菜单项。事件属性对话框由事件,进程和栈三个标签组成。你可以显示前一个或后一个,也可以高亮某个事件通过选择下面的选项。
事件
事件页中会显示针对于某个事件的相关信息,包括顺序号,所属线程,事件类和操作,结果,时间戳,如果适用的话还有资源路径。只有文件系统和注册表事件定义了资源路径。根据事件的操作,在事件页下方列出了详细内容。这些内容跟主窗口所显示的信息一致,每个信息由分割线隔开。
进程
事件的进程标签中会显示执行这个事件的进程的信息。包括进程镜像的数据,比如路径和版本,进程页显示进程的执行属性,比如进程ID,运行进程的用户账户,如果事件是在64位系统下产生,需要标识程序时32位还是64位的。如果程序运行在Vista以上系统,Process Monitor显示进程的可信度和进程是否是虚拟的。
进程页下方显示了在进程中,事件发生时进程加载的模块信息和它的地址。双击列表中的模块可以浏览到该模块的更多的信息,包括它的版本信息。
栈
栈页中显示了事件被记录的时刻的线程栈信息。栈是非常有用的对于判断事件发生的原因和哪个组件导致事件的发生。栈的内核模式帧用字母‘K’在帧的左边标识,用户模式栈(用户模式栈在Vista SP1/WindowsServer 2008之前的64位系统中不可用)用字母‘U’。如果Process Monitor可以定位镜像引用的符号表,它将会尝试转换地址为其所属的函数。将如果符号表必须从网络中获取,那么符号表的分析将花费一些时间,比如说微软的符号服务器。从Options菜单中,使用符号配置对话框,可以配置符号表。
如果你在符号配置对话框中指定了源文件路径,那么栈对话框中的Source按钮会变为有效对于那些有符号表的行号,并且源文件存在于你所设置的路径。点击Source按钮,打开了一个文本浏览器并且高亮了引用到的源代码行。
浏览更多的关于栈记录框中罗列出的镜像的信息,可以双击帧或者选择要查看的帧,然后按下方的Properties按钮。
从事件菜单中选择栈菜单可以直接打开事件属性对话框中的栈标签页。
5.过滤和高亮
Process Monitor提供了几种方式来配置过滤器和高亮
引入和排除过滤器(Includeand Exclude Filters)
你可以指定事件的属性,这样Process Monitor将仅仅显示你的指定。或者用属性值做对比来排除一些事件。所有的过滤器都是无害的,意思就是它们的作用仅仅是在Process Monitor中把事件显示出来,而不作用与下面的数据。
在Event菜单中选择Include和Exclude子菜单,可以简单的添加一个事件属性到Include或者Exclude过滤器。例如:选择Include子菜单中的Process Name选项来显示特定进程所发生的事件。你也可以选择多个事件并且为所选取事件包含的所有唯一值同时配置一个属性过滤器。Process Monitor在所有过滤器中取“OR”,与相关特定的属性类型。并在不同的属性类型中取“AND”。例如:如果你指定进程名包括Notepad.exe和Cmd.exe,并加一个路径Include filter为C:\Windows,Process Monitor将显示Notepad.exe或者Cmd.exe中的包含特定路径C:\Windows的事件。
你可以选择Filter菜单下的Filter项,或者点击Filter工具栏按钮来配置更复杂的过滤器选项。过滤器条目由一个属性域组成(例如:Authentication ID,Process Name等),一个比较操作,一个属性值,还有过滤类型包括Include或Exclude。为了方便,Process Monitor将自动的用已加载的trace data来填充属性值下拉列表,但你可以输入任意值。复选框中你可以禁止指定的过滤条目而不用删除它们。
过滤器上下文菜单(Filter Context Menu)
如果你在某一项上右击鼠标,Process Monitor显示一个上下文菜单来让你查看所选项的属性或者基于所选项的属性来配置一个过滤器。而且,你所点击列的值已经添加到了quick-filter条目中了。
有损的过滤(Destructive Filtering)
默认情况下,Process Monitor过滤器应用于它所显示的数据,而不作用域它保存了的数据。那么你可以改变过滤器来获取不同的数据视图,而不影响已排除的数据。然而,你可以配置Process Monitor通过一个过滤器来任意删除那些被排除的数据,当数据在togglingdestructive filtering模式下已经被捕获,通过选择Filter菜单下的Drop Filtered Events选项。
从窗口中选取进程(Include Process from Window)
工具栏中包含了一个像靶子一样的按钮,你可以拖出并拖入某个窗口中来使Process Monitor添加这个进程的ID到Include filter中。
基础vs高级模式(Basic vs. Advanced Mode)
Filter菜单的Enable Advanced Output菜单项控制着ProcessMonitor是在基础模式下进行操作还是在高级模式下进行操作。当在基础模式下Process Monitor配置内置的过滤器来排除系统相关的活动,并为内部文件系统操作分配直观的名字。例如:在基础模式下,Process Monitor显示内部的IRP_MJ_READ操作为Read。基础模式使得输出变得容易阅读并且省略与应用程序错误分析(troubleshooting)不相关的事件。
保存和加载过滤器(Saving and Loading Filters)
你可以选择Filter菜单下的Save Filters菜单项来保存你已经配置好的过滤器。Process Monitor可以通过Load Filter菜单来加载过滤器,你可以使用Organize Filters对话框来改变过滤器显示的规则,通过Filter菜单下的Organize Filters可以打开。你可以使用Organize Filter 对话框来重命名已经保存了的过滤器,也可以导出过滤器到一种格式然后你也可以使用Organize Filter对话框在另外一个系统中导入进来。
高亮(Highlighting)
Process Monitor的高亮过滤器使你可以指定事件属性来使得事件用高亮的颜色来显示。Event菜单下的Highlight子菜单提供了快速的方式来定义高亮过滤器条目,选取Filter菜单下的Highlight菜单项后会弹出Highlight Filter对话框,这里的操作与Include/Exclude Filter对话框类似。
6.进程树(The Process Tree)
在Tools菜单中选择Process Tree菜单项可以打开“进程树对话框”,它通过层次级别来显示所有的进程并反映他们的父子关系。相同父进程下的子进程根据他们的启动时间来进行排序。进程靠窗口的左边对齐。
当你在树种选择一个进程,Process Monitor获取到的数据的一个子集讲显示在对话框的下方,其中包括镜像路径,用户账户和开始时间。点击Go To Event按钮可以查看该进程的更多的信息,它将定位并选择该进程发生并被记录的事件的第一条项目上。注意,过滤器排除指定进程的事件之后,这个操作会被禁止。
信息概要工具(Trace Summary Tools)
Process Monitor包含了很多对话框来让你可以在事件记录中执行简单的数据挖掘技术。
系统详细信息(System Details)
Process Monitor捕获一些关于系统的信息,包括机器名,系统根目录,还有操作系统的版本是32位的还是64位的。你可以通过Tools菜单中的System Details对话框来把这些信息存储到记录文件中。
发生次数(Count Occurrences)
在Tools菜单中可以打开Count Occurrences对话框。它显示了某个属性类型的某一个值在记录中的有多少条事件中包含了这个值,或者发生了多少次某个指定的事件。
进程概要(Process Summary)
这个对话框总结了记录中看到的进程,包括他们的进程ID,镜像名,还有命令行。
文件概要(File Summary)
文件概要对话框罗列了已经被记录的每一个文件系统路径,还有对该文件执行I/O操作所用的时间总和,一共有多少事件引用到了该路径,有多少种操作类型。
注册表概要(Registry Summary)
注册表概要对话框罗列了已经记录的信息中每个注册表路径,还有对该注册表路径执行I/O操作所用的时间总和,引用到了该注册表路径的事件总数,有多少种操作类型。
网络概要(Network Summary)
网络概要对话框罗列了已经记录了的信息中的每个目标IP地址和有多少种事件类型,包括发送和接收到的对于每个地址。
栈概要(Stack Summary)
使用栈概要对话框来查看每个进程栈信息的单个实例,包括栈记录重现的次数,并显示同一个记录集中事件所花费的总时间。
对照索引概要(Cross Reference Summary)
这个对话框显示一个进程写入而另外一个进程也读过的路径。
7.选项
在Options菜单中有很多设置可以改变Process Monitor的行为。
总是在最上(Always On Top)
选择这个选项后可以使Process Monitor窗口保持在其他窗口的上方。
字体(Font)
这个选项打开了一个字体选择对话框来让你选择ProcessMonitor所使用的字体。
高亮颜色(Highlight Colors)
选择这个选项打开一个对话框来选择ProcessMonitor为那些高亮过滤器中相符条目所使用的文本和背景颜色。
设置符号表(Configure Symbols)
Process Monitor可以使用符号信息,如果符号表是有效的,在事件栈中会显示函数的引用。你可以在 Microsoft Debugging Tools for Windows 网页上找到一些关于配置符号表的信息。
来历的深度(History Depth)
Process Monitor查看已经提交了的内存的使用情况并在虚拟内存不足的情况下关掉他们,而来历深度(History Depth)对话框可以让你来限制保存的条目的数量,这样就可以使得ProcessMonitor长期的运行并且确保总是保存了最近发生的事件。
性能分析事件(Profiling Events)
使用这个选项来打开性能分析配置(ProfilingEvents)对话框,通过该对话框,你可以启用线程性能分析并估算线程性能分析事件发生的数量。如果线程性能分析已经启用,Process Monitor将捕获线程栈记录和CPU使用率,你可以用这些数据来判定CPU相关资源的性能分体。
启用根记录(Enable Boot Logging)
通过这个选项来配置Process Monitorboot logging
8.保存和记录(Saving and Logging)
文件格式(File Formats)
你可以通过File菜单下的Save子菜单来保存Process Monitor数据为原生的(PML),CSV或XML格式。PML格式保存所有捕获到的数据,所以你可以在原始的系统或者一个不同的系统上重载这些数据到ProcessMonitor中。CSV文件对导入Excel或其他数据分析应用程序非常有用。最后,XML格式的数据可以被操作XML的工具所解析。
记录
默认情况下,Process Monitor使用虚拟内存来保存捕获到的数据。在File菜单下打开支持文件(Backing Files)对话框来配置Process Monitor保存捕获到的数据到磁盘上的文件。ProcessMonitor会使用原生的PML格式来保存捕获到的数据。
支持文件(Backing Files)对话框也显示了诊断信息,包括捕获了多少个事件,明确的进程和捕获线程的加载状态。
9.启动记录
Process Monitor 可以再启动过程很早的时候就开始记录系统的活动,早到启动设备驱动程序初始化的时候。可以通过"Options"菜单下的Enable Boot Logging 选项来配置Process Monitor 从而记录下一次启动过程。Process Monitor的驱动将记录下一次启动过程中记录到的活动保存到 %Windir% 下的一个文件中,并将继续记录活动直到关机或者是你再次运行ProcessMonitor。因此,如果你在一个会话中没有运行Process Monitor,那么你将截获从启动到关机这么一个过程中的所有活动。
在Windows Vista或更高的版本中,Process Monitor支持在启动记录过程中捕获线程概要信息。当你在所支持的操作系统中启用了启动记录,Process Monitor将弹出一个对话框来询问启动记录是否包含了线程概要信息。值得注意的是线程概要信息将显著的增加启动记录文件的大小。
当你运行Process Monitor ,它将会查看之前是否有启动记录信息生成,如果有,则询问你想把处理过的启动记录文件保存到哪里。等转化完毕之后Process Monitor将显示这些记录。如果想查看System进程的活动,这个启动过程中最早的进程,你可以再Options菜单下选择Enable Advanced Output。
如果你配置了启动记录,并且系统在启动的早期崩溃了,那么你可以通过选择Windows启动菜单中的“最后已知完好的设置”来取消启动记录。(需要在启动过程中按F8键)
注意:基于ETW(Event Tracing forWindows)的网络事件,没有在启动记录的日志中。
10.配置的导入和导出
如果你配置好了过滤器,你可以通过Tools菜单下的Save Filters菜单项来保存你进行的配置。Process Monitor添加你保存的过滤器配置到Load Filter菜单中,使你可以方便的应用,并且你还可以使用OrganizeFilters对话框来更改过滤设置显示的次序,该对话框要在Tools菜单下打开。你可以用Organize Filter对话框来给保存的过滤器改名,不但可以以某种格式导出过滤器设置并且还可以再其他的系统中通过本对话框来导入配置。
你也可以导出Process Monitor的全部配置信息,包括过滤器,列的选择,列的次序和大小,日志文件的设置和调试帮助文件的路径配置到一个Process Monitor Configuration文件(.PMC)。这个操作需要使用File菜单下的Export Configuration菜单。使用File菜单的Import Configuration来加载一个保存了的配置文件或者通过命令行选项/LoadConfig。
11.命令行选项
Process Monitor支持一些命令行选项:
/Openlog <保存了的PML日志文件>
让Process Monitor打开并加载指定的日志文件
/Backingfile <日志文件名>
让Process Monitor创建和使用指定的文件名命名日志文件
/Pagingfile
保存事件到页文件。
/Noconnect
当选中了这个选项,Process Monitor不会自动记录活动
/Nofilter
在启动的时候清除过滤器
/AcceptEula
自动接收许可并绕开EULA(最终用户许可协议)对话框。
/Profiling
启用线程概要事件。
/Minimized
Process Monitor将以最小化的方式启动。
/WaitForIdle
等待一个Process Monitor实例准备好。
/Terminate
结束所有的Process Monitor实例并退出。
/Quiet
不在启动的时候确认过滤器的设置。
/Run32
使用此指令让32位版本的Process Monitor运行在64位的Windows中,并打开在32位系统下生成的日志。
/HookRegistry
此开关只在32位的Vista和Server2008中有效,让Process Monitor使用system-call hooking 来代替Registry callback mechanism来监控注册表活动,在这些操作系统中通过启用本指令来查看虚拟应用程序的虚拟注册表操作。这个选项必须在Process Monitor在系统中运行的第一次中启用,而且只能用来为虚拟应用程序(SoftGrid)查找错误。
/SaveAs, /SaveAs1, /SaveAs2
使用这些开关配合/OpenLog来让Process Monitor导出一个日志文件到CSV,XML或者PML格式。/SaveAs1选项包括栈信息导出到XML格式,/SaveAs2选项添加符号信息。
/LoadConfig
加载指定的过滤器和设置文件。
12.Process Monitor脚本
你可以使用Process Monitor命令行指令来集合到一个批处理文件。下面这个示例是一个用来捕获notepad.exe执行信息的批处理文件:
set PM=C:\sysint\procmon.exe
start %PM% /quiet /minimized /backingfile C:\temp\notepad.pml
%PM% /waitforidle
start /wait notepad.exe
%PM% /terminate
Process Monitor第一次调用start是要确保进程从控制台窗口中分离,从而允许他执行后面的指令。start的第二次调用配合了/WaitForIdle指令,这是因为批处理文件需要等到Process Monitor的第一个实例启动完毕并且开始捕获事件的时候才能运行notepad.exe。最后一次调用使用了/Terminate 来告知实例停止捕获,提交所有数据到备份文件最后完全退出。
13.注入应用程序调试信息
如果你是一位应用程序的开发者,那么包含你自己的调试输出信息到Process Monitor的事件流中可能会很有好处,因为你可以更好的关联应用程序操作与其他事件。Process Monitor允许无特权级的应用程序来注入宽字符串信息,最大的长度为2048。下面的示例代码展示了如何去打开Process Monitor调试接口,并且写入信息到事件流。字符串并不需要以null结尾,但这个示例中是这样用的。下面的示例代码展示了如何来生成Process Monitor调试输出。John Robbins写了一个helper classes,你可以在你本地上使用,或者方便的支持托管应用,你可以到这里下载它:http://www.wintellect.com/CS/blogs/jrobbins/archive/2010/04/13/see-the-i-o-you-caused-by-getting-your-diagnostic-tracing-into-process-monitor.aspx
注意:你必须显示Profiling events来看下面的事件。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define FILE_DEVICE_PROCMON_LOG0x00009535
#define IOCTL_EXTERNAL_LOG_DEBUGOUT (ULONG) CTL_CODE( FILE_DEVICE_PROCMON_LOG,0x81, METHOD_BUFFERED, FILE_WRITE_ACCESS )
int main( int argc, char * argv[] )
{
HANDLE hDevice = CreateFile(L"\\\\.\\Global\\ProcmonDebugLogger", GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL );
if ( hDevice !=INVALID_HANDLE_VALUE ) {
WCHAR text[] = L"Debugout";
DWORD textlen = (_wcslen(text)+1)*sizeof(WCHAR)
DWORD nb = 0;
BOOL ok = DeviceIoControl( hDevice,IOCTL_EXTERNAL_LOG_DEBUGOUT, text, textlen, NULL, 0, &nb, NULL );
if ( ok ) {
printf( "wrote %d\n", i);
} else {
printf( "error 0x%x\n",GetLastError() );
}
} else {
printf( "error %d openingProcess Monitor\n", GetLastError() );
}
return 0;
}