6. 信息概要工具(Trace Summary Tools)
1.介绍 Process Monitor 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后,它就开始监听三类操作,包括:文件系统,注册表,进程。
有许多基础设置控制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
Event Details
Process Management
4.事件属性 你可以双击单个事件来查看它的属性内容,或者当右击属性的时候选择属性菜单项。事件属性对话框由事件,进程和栈三个标签组成。你可以显示前一个或后一个,也可以高亮某个事件通过选择下面的选项。 事件 进程 进程页下方显示了在进程中,事件发生时进程加载的模块信息和它的地址。双击列表中的模块可以浏览到该模块的更多的信息,包括它的版本信息。 栈 如果你在符号配置对话框中指定了源文件路径,那么栈对话框中的Source按钮会变为有效对于那些有符号表的行号,并且源文件存在于你所设置的路径。点击Source按钮,打开了一个文本浏览器并且高亮了引用到的源代码行。 浏览更多的关于栈记录框中罗列出的镜像的信息,可以双击帧或者选择要查看的帧,然后按下方的Properties按钮。 从事件菜单中选择栈菜单可以直接打开事件属性对话框中的栈标签页。
5.过滤和高亮 Process Monitor提供了几种方式来配置过滤器和高亮 引入和排除过滤器(Includeand Exclude Filters) 在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) 有损的过滤(Destructive Filtering) 从窗口中选取进程(Include Process from Window) 基础vs高级模式(Basic vs. Advanced Mode) 保存和加载过滤器(Saving and Loading Filters) 高亮(Highlighting)
6.进程树(The Process Tree) 在Tools菜单中选择Process Tree菜单项可以打开“进程树对话框”,它通过层次级别来显示所有的进程并反映他们的父子关系。相同父进程下的子进程根据他们的启动时间来进行排序。进程靠窗口的左边对齐。 当你在树种选择一个进程,Process Monitor获取到的数据的一个子集讲显示在对话框的下方,其中包括镜像路径,用户账户和开始时间。点击Go To Event按钮可以查看该进程的更多的信息,它将定位并选择该进程发生并被记录的事件的第一条项目上。注意,过滤器排除指定进程的事件之后,这个操作会被禁止。
信息概要工具(Trace Summary Tools) Process Monitor包含了很多对话框来让你可以在事件记录中执行简单的数据挖掘技术。 系统详细信息(System Details) 发生次数(Count Occurrences) 进程概要(Process Summary) 文件概要(File Summary) 注册表概要(Registry Summary) 网络概要(Network Summary) 栈概要(Stack Summary) 对照索引概要(Cross Reference Summary)
7.选项 在Options菜单中有很多设置可以改变Process Monitor的行为。 总是在最上(Always On Top) 字体(Font) 高亮颜色(Highlight Colors) 设置符号表(Configure Symbols) 来历的深度(History Depth) 性能分析事件(Profiling Events) 启用根记录(Enable Boot Logging)
8.保存和记录(Saving and Logging) 文件格式(File Formats) 记录 支持文件(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 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./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> #define FILE_DEVICE_PROCMON_LOG0x00009535 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) 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; } |
|