前言
一般,我们会使用任务管理器查看系统中有哪些进程正在运行,强制杀掉某个进程。可是系统自带的任务管理器功能有限,process explorer
是一个功能更强大的工具。它可以让我们查看更多更详细的信息( 比如查看某个进程的父进程,进程加载了哪些dll
,打开了哪些文件,线程的cpu
使用情况,线程的调用栈,哪些文件被哪些进程占用了,等等 …… )。有没有办法让process explorer
替换系统自带的任务管理器呢?:thinking:
功能介绍
这个功能,process explorer
的作者Mark Russinovich
已经帮我们想到了。process explorer
提供了一个很酷的功能——替换任务管理器(taskmgr.exe
),这样当我们运行任务管理器的时候,就会自动打开功能更强大的process explorer
了。
{% note info %}
说明:此操作需要以管理员权限运行process explorer
。
{% endnote %}
这么厉害的操作,是怎么实现的呢?
实现原理
原来windows
中有个注册表项HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options
。如果程序A
在Image File Execution Options
下有对应的注册表项, 当我们启动程序A
的时候,系统会启动Debugger
子项中的值对应的程序,并把程序A
的路径当作参数传递过去。
以taskmgr.exe
为例,设置如下图:
当taskmgr.exe
启动的时候,系统检测到taskmgr.exe
在Image File Execution Options
下有对应的设置项,系统会启动Debugger
子项中的值对应的程序C:My oolssysinternalsprocexp.exe
,并把taskmgr.exe
的路径(我机器上是C:WINDOWSSYSTEM32TASKMGR.EXE
)当作参数传递给procexp.exe
。
验证
process explorer
到底是不是通过这种方法实现的呢?让我们用process monitor
来观察一下整个过程吧。具体步骤我就省略了,请参考下面的动图。
{% note warning %}
注意: process monitor
默认会过滤掉process explorer
相关的事件,如果想看到相关事件,需要手动取消过滤。自己验证的时候,一定不要忘了这一点。为了引起大家的重视,我特地把相关设置截图贴到下方!
{% endnote %}
轻松一下
既然我们知道了原理,我们可以尝试尝试其它玩法。用notepad.exe
替换taskmgr.exe
怎么样?当启动taskmgr.exe
的时候,启动的将会是notepad.exe
。
何不用这项技术娱乐下周围的同事?替换掉大家常用的vs
(对应的名字为devenv.exe
),这样当同事打开vs
准备写代码的时候,会是什么表情呢? :smirk:
脚本
把下列代码保存成taskmgr.reg
,双击即可导入到注册表。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options askmgr.exe]
"Debugger"=""C:\My\tools\sysinternals\procexp.exe""
{% note warning %}
注意: debugger
的值要替换成你自己机器上的路径。
{% endnote %}
你知道吗?
可以使用Ctrl + Shift + Esc
或者Ctrl + Alt + Delete
来打开任务管理器。你喜欢用哪种方式打开呢?还知道其它打开任务管理器的方法吗?
总结
-
利用
process monitor
的Process Tree
功能,可以方便的让我们查找到指定的进程,并进行过滤。 -
Image File Execution Options
注册表项很好很强大。镜像劫持。 -
process explorer
和process monitor
只是sysinternals
工具集中的两个常用的工具。心动了吗?官方下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/
参考资料
- Image File Execution Options
- 《Windows Sysinternals 实战指南》