使用Process Monitor工具监测进程对注册表和文件的操作

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Process Monitor工具监测进程对注册表和文件的操作相关的知识,希望对你有一定的参考价值。

目录

1、概述

2、如何使用Process Monitor

3、监测进程操作注册表活动案例

3.1、高显示比例下大部分软件界面会变得很模糊

3.2、如何设置才能使得软件显示的清晰一些?

3.3、使用Process Monitor监测上述设置对应的注册表的操作

4、监测进程操作文件活动案例


       使用Process Monitor可以监控到目标进程对注册表、文件等的操作活动,以方便一些问题的定位与排查。今天我们就来讲一下,如何使用Process Monitor工具,并给出相关的排查案例,以供参考。

1、概述

       使用Process Monitor可以监测目标进程对注册表、文件、网络等的操作活动,以辅助定位和排查一些软件运行过程中遇到的一些问题。比如我们使用该工具可以监测到目标进程在写入注册表时,写入的路径和内容,可以监测某个文件是哪个模块生成的(可以查看创建文件时的完整函数调用堆栈),这两方面的监测我们在实际的项目中都用过。

2、如何使用Process Monitor

       启动该工具时,就会弹出设置过滤条件的窗口:

一般我们需要设置一下要监测的目标程序的进程名。在下拉框中找到Process Name项,在条件输入框中输入要监测的程序的进程名

点击Add按钮即可。如果启动时没设置,直接将过滤条件设置窗口关闭了,也可以点击工具栏中形似漏斗的按钮,手动打开这个过滤条件设置窗口。

       为什么要设置进程名的过滤条件呢?因为系统中运行着多个进程,如果不设置过滤条件,默认会监测所有的进程,会产生大量的监测项,查看起来会非常麻烦。为了缩小监测范围,我们一般需要设置过滤的进程名。

       除了设置过滤条件,还需要将不相关的活动监测取消掉,如果检测注册表操作活动时,在工具栏中将其他活动监测取消掉。如果不取消,会监测很多类型的记录,查看起来会很不方便。

       该工具启动后自动开启监测,可以点击形似放大镜的按钮,先将监测停止掉,待开始准备监测某一活动时再开启监测,这样能减少监测记录。待监测的操作结束后,点击该按钮,立即停止监测,避免持续产生不相关的监测记录。

        停止监测后,可以在监测结果列表中以关键字搜索,以找到相关的记录。

3、监测进程操作注册表活动案例

3.1、高显示比例下大部分软件界面会变得很模糊

       在win7或win10系统中,将系统的显示比例设置为大于100%的显示比例后,很多程序都会变得很模糊,程序显示效果放大了,系统会自动对软件的界面进行简单粗犷地放大,文字和图片都变大,也变得很模糊,如下所示:(以Dependency Walker工具为例)

       但有个别软件依旧显示的很清晰,和100%显示比例时一样清晰,比如腾讯系的QQ、PC版微信、腾讯会议等软件,这些软件都自己实现了缩放,禁用了系统对其的缩放,所以能保持很好的清晰度。

        但要自己实现跟随系统显示比例的缩放,技术上会比较难,要处理各种细节问题,处理的不好,会出一堆的bug,所以大多数软件厂商还是依赖于系统的简单缩放。很多使用QT开发的程序能自动适应系统的缩放比例,因为QT库中已经添加了对系统高DPI的适配。

3.2、如何设置才能使得软件显示的清晰一些?

       对于大多数软件,有没有办法让其在高显示比例下能够保证很好的清晰度呢?答案是肯定的,Windows系统提供了相关的设置。可以右键点击exe程序或者exe程序的快捷方式,在文件的属性窗口中日点击兼容性标签页,点击窗口下方的“更改高DPI设置”按钮:

在打开的窗口下方的“高DPI缩放”栏,勾选“替代高DPI缩放行为”:

在下拉了列表中选择“应用程序”项,这样就能禁止系统缩放,程序仍然按100%大小显示,这样就能继续保持清晰度了。

       但这有个问题,在高分辨率的显示屏上,比如2K屏的微软Surface平板电脑上,一般会设置150%及以上的显示比例,如果禁止系统缩放,窗口就会特别小,按钮就更小了,根本没法使用的,所以还是要使用系统缩放的,那怎么保证清晰度呢?这点Windows系统也考虑到了,可以在下拉框中选择“系统增强”:

系统会让缩放后的效果更佳清晰一些。

3.3、使用Process Monitor监测上述设置对应的注册表的操作

       如果客户在使用时遇到窗口放大模糊的问题,我们不可能一一去告诉他们去做上述设置,那么有没有可能通过代码去自动设置呢?上面讲述的手动设置,系统将设置信息保存到哪里去了呢?感觉很大可能是保存到注册表中了,于是想用Process Monitor去监测一下注册表活动,看看能否找到信息保存到那个注册表路径中了以及向注册表中写入了什么信息。

       上述设置窗口是隶属资源管理器进程explorer.exe的,所以我们在Process Monitor中将要监测的进程设置为explorer.exe:

然后取消对其他活动的监测,只监测注册表活动。

       然后开启监测,手动按上面讲到的过程操作一下,然后停止监测。因为这个高显示比例应该是与DPI相关的,所以按下Ctrl+F调出搜索框,输入DPI关键字:

在监测到的结果中搜索。如果按关键字可以搜索到多记录,可以按下F3快捷键在这些满足条件的记录之间来回切换。关键字匹配到的结果,要加以甄别,看看到底那条记录是与当前的操作相关的。

       因为上述设置操作是写数据库,所以我们只需要关注RegSetValue的操作,后来找到了注册表写入的位置:

对应的注册表位置为HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers,写入的key值为exe程序的路径,Value值为:

1)应用程序选项,是禁用系统缩放,程序始终保持100%显示比例,写入的内容为:~ HIGHDPIAWARE
2)系统增强选项,使用系统缩放,系统对显示的清晰度进行改进,写入的内容为:~ GDIDPISCALING DPIUNAWARE

知道了注册表写入的位置以及写入的内容,我们就可以通过代码去实现这个设置了。

4、监测进程操作文件活动案例

       比如在测试软件时,发现软件在运行的过程中会产生一些临时的日志文件,比如有次我们遇到软件会在桌面上产生一个日志文件,明显这是不能容忍的,日志要统一管理,不必要的日志文件都要统统清理掉。

       但我们不知道这些日志文件是哪些模块产生的,询问了底层模块的开发维护组,也没人认领,没法搞清楚这个日志是那个模块产生的,也就无从清理了。后来我们向测试同事推荐Process Monitor工具,通过该工具监测我们软件的文件活动,看看这个文件到底是哪个模块生成的,最后确实找出来了。

      下面列举一个监测文件的实例,以供大家参考。比如我们要监测TestScreenCatch.exe程序中是哪个模块生成了screencatch.log文件:(此处只是范例,此处通过文件名称就能猜出是哪个模块生成的)

       先启动Process Monitor工具,将要监测的进程设置为TestScrrenCatch.exe:

开启监测。重新运行TestScrrenCatch.exe程序,有代码向screencatch.log文件中写日志,然后停止Process Monitor的监测。

       然后按下Ctrl+F快捷键,调出搜索窗口,输入screencatch.log关键字进行搜索,找到操作screencatch.log文件的记录,双击记录,打开记录的详情页面:

切换到stack标签页,查看当前操作所在线程的函数调用堆栈:

最上面系统库的接口,调用堆栈向下拉动一下,找到调用fopen或者WriteFile接口,再向下就看到具体业务模块的接口了:

发现是screenctach.dll库的相关接口中向screencatch.log文件写入内容的。但因为缺乏pdb文件,无法看到具体的接口。

        我们可以先试用PEViewer工具查看screenctach.dll库的时间戳(生成screenctach.dll库的时间):

然后按照该时间戳到版本服务器上找到screenctach.dll库对应的pdb文件,将pdb文件放到screenctach.dll库的同级目录中,再次双击刚才查看的那条记录,Process Monitor会自动从当前目录中去搜索pdb文件,然后自动去加载。因为有了screenctach.dll库的pdb符号,函数调用堆栈中就显示了具体的接口和行号了,如下所示:

这样我们就知道是哪个模块哪句代码操作screencatch.log文件了,就找到生成screencatch.log文件的源头了。

以上是关于使用Process Monitor工具监测进程对注册表和文件的操作的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用Process Monitor

Process Monitor V2.96 (系统监视工具) 汉化免费绿色版

使用Azure Monitor监视Process

process explorer和process monitor有啥不同

Process Monitor监控进程操作注册表如何实现?

自动驾驶 Apollo 源码分析系列,系统监控篇:Monitor模块如何监控进程 Process 的存活状态?