Sysinternals---Process monitor

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18218335/article/details/79316978

Process Monitor 是Windows 平台使用的一个比较高级的监控工具,它可以实时的显示文件系统、注册表和进程、线程的活动。它集合了FileMon 和 Regmon 两个工具的功能,并进行了特别的功能增强。
主要功能包括:

1.可获取到输入输出操作的更多的参数。
2.无侵害过滤,设置filter 的同时不会导致数据的丢失。
3.截获每一个操作的线程栈,从而使得分析每一个操作发生的根源称为可能。
4.获得相关进程的更详细的信息,包括命令行,镜像路径,用户和会话ID
5.自定义的显示配置
6.可以为任何数据子段设置过滤器,包括未配置为列的子段。
7.先进的日志记录体系结构,可以扩展到数千万个捕获的事件和千兆字节的日志数据
8.进程树显示在一次追踪中的所有进程之间的关系
9.通用的日志格式,以便在不同的Process Monitor 实例中加载
10.在进程上悬空时会显示进程的镜像信息。
11.另外,在行上悬空时,它会显示当前行由于列宽的原因而暂未全部显示的信息。
12.可撤销的搜索
13.引导时加载,以记录系统的所有操作

实例分析进程的加载过程,看看该工具能给我多少信息

  • 为了简单期间,我们首先选取Win7 (Vista+即可)进行实验。
int main()
{
    printf("Hello World\r\n");
    return 0;
}

分析什么都不做的进程的操作也有利于我们在真正分析问题的时候过滤掉不重要的问题,抓住问题的重点。
这里写图片描述

打开后我们点击1处标记的按钮,会弹出该对话框以设置filter 规则,如果不设置我们自己的规则,系统产生的数据将会极其多。另外,Process Monitor 默认添加了一些Exclude,我们看自己的需要选择吧,刚开始我们暂时不修改默认的Exclude。添加好规则后全部规则如下:注意输入进程名称时需要输入扩展名。
这里写图片描述
之后点击OK,双击运行DemoProgram.exe。为了更好的描述信息,我们在列标题上右键,选择Select Columns 菜单,之后在弹出的菜单中选择Sequence Number,给截获到的事件加上编号,之后我们可以通过拖拽的方式将编号移动到第一列。
这里写图片描述

另外,我们当前设置是截获包括,注册表,进程线程,文件,网络的所有信息,如果想选择特定类型的信息,点击如下按钮:
这里写图片描述
截获到如下信息:
这里写图片描述

下面依次分析进程操作:
0—Process Start
这里写图片描述

进程初始执行的环境是父进程的环境,之后这里我们唯一可见的符号是ntdll.dll 的NtCreateUserProcess 函数,其他函数我们也不是特别清楚,总之这里的操作就是在父进程的线程环境下执行了创建新进程的进程对象的操作,里面的诸多细节我们就不深究了,因为是内核方面的操作。

1—Thread Create
这里写图片描述
这里与进程初始类似,初始进程的第一个线程也是在父进程的线程环境下创建的,而且是创建的线程对象。

2—Load Image—-DemoProgram.exe
将EXE 镜像映射到新进程的地址空间,并执行校验签名等一系列的操作。

3—Load Image—-ntdll.dll
ntdll.dll 模块的加载与普通的DLL模块加载不同,由于ntdll.dll 是需要在系统的所有进程中加载的,系统初始化时就将dll 映射到了内存中,之后再在新进程初始化的时候将ntdll.dll 映射到新进程的地址空间中,而且这个地址在所有的进程的地址空间中是一样的。

4—CreateFile—C:\Windows\Prefetch\DEMOPROGRAM.EXE-934BCD18.pf
Prefetch,预取器,操作系统在程序运行的时候,会首先去该目录下查找是否有当前程序的预取器,有的话就可以按照已经有的加载过程加载进程,所谓预取就是提前加载,按照往常的经验来判断程序将会执行哪部分的内容,从而提前一次性的全部加载完毕,这种将多次读入操作合并起来的行为可以 有效的提高程序的加载速度。由于我们的程序是第一次执行,所以这里是CreateFile 的操作,之后再次执行这个程序将会执行OpenFile 和 ReadFile的操作。

5~8—-打开注册表HKLM\System\CurrrentControlSet\Control\Session Manager并读取其子键CWDIllegalInDLLSearch的值,关闭注册表键。
我们看到,这里是没有找到这个子键的值。

9—CreateFile—C:\Users\admin\Desktop
我们看起调用堆栈如下:
这里写图片描述
ntdll.dll:LdrInitializeThunk 是新创建的进程在Ring3执行的第一段代码,它的作用相当于执行EXE 文件的导入表解析等等的初始化功能,这个CreateFile 的作用,我猜测,是打开进程的当前目录,或者是在解析其导入表的时候尝试在当前目录下找到其导入文件。

10—LoadLibrary—-C:\Windows\System32\Kernel32.dll
这里写图片描述

依然是解析导入表,进行基本的初始化操作。
11—LoadLibrary—C:\Windows\System32\KernelBase.dll
Kernel32.dll 的依赖的初始化操作
这里写图片描述

12~19—语言相关的操作
20~34—这一段也是注册表操作,暂时还不清楚是做什么的。
35—主线程退出
36~40—枚举所有的进程加载的模块名。
41~46—关闭主进程文件。
47—Process Exit—-这个退出代表的是进程对象的销毁。
48—CloseFile—-关闭上面打开的文件:Desktop
49~50—关闭上面打开的未关闭的注册表

途中的很多信息现在暂时不知道什么意思,但是一个简单的printf语句就能产生这么多信息,我们大概看一遍,以后分析时才能抓住重点。

另外,如果我们想快速查找想知道的特定信息,可以Ctrl+F进行查找,十个十分方便的功能。

还有一个需要注意的是,此应用程序不能长时间保持运行,因为它对系统各个方面的操作进行监控,十分占用资源。

如果想长时间大量的监控程序的运行,可以选择使用文件为后备文件而不是虚拟内存。否则会出现内存耗尽的问题。

引导时记录

在引导启动设备驱动程序初始化时,Process Monitor 可以在引导过程的比较早的阶段开始log 活动。通过菜单选择Enable Boot Logging 可以开启引导时log 功能。Process Monitor 的驱动将在下次引导的时候进行log 活动,并将信息存储在$Windr%目录下,另外,这个log 活动将持续到关机或者再次运行Process Monitor。因此,如果在一次引导过程会话中不执行Process Monitor,Process Monitor 的驱动将记录从开机到关机的完成的信息。
thread profiling 会极大的增加日志的大小,可根据需要选择是否开启此功能。
当我们运行Process Monitor,它查看是否之前有一次引导log,如果有的话,它将询问你存储引导log 文件的位置。Monitor 在解析完log 文件后,会将其显示给用户。如果想看System Process 的活动,从菜单中选择Enable Advanced Output

如果配置了引导log,而系统在引导期间崩溃了,可以通过从Windows boot menu 中选择Last Known Good option 来关闭引导 log。

另外,由于Process Monitor 的网络事件是通过 ETW(Widows 事件追踪)实现的,引导log 时不支持该功能。

猜你喜欢

转载自blog.csdn.net/qq_18218335/article/details/79316978