如何检测进程将被任务管理器终止并识别终止源进程?
检测自身进程被任务管理器终止的时机及识别源进程方案
一、检测进程即将被终止的时机
用户态方案
- GUI程序窗口消息监听:注册回调监听
WM_QUERYENDSESSION和WM_CLOSE消息。当任务管理器执行「结束任务」时,会先向目标进程发送这类消息,进程可在此阶段触发处理逻辑。但需注意:若任务管理器执行强制「结束进程」操作,系统会直接终止进程,不会发送此类消息。 - 控制台程序信号处理:调用
SetConsoleCtrlHandler注册回调函数,捕获CTRL_CLOSE_EVENT信号——该信号会在任务管理器关闭控制台窗口时触发。同样,强制终止操作无法触发此信号。
内核态方案
- 进程终止回调驱动:编写内核驱动,调用
PsSetCreateProcessNotifyRoutineEx注册回调函数。当系统内任何进程(含自身)即将被终止时,回调会被触发,可在此执行检测逻辑。这种方式能覆盖强制终止场景,但需要管理员权限,且驱动必须经过微软数字签名(Windows 10及以上版本强制要求)。
二、识别发起终止操作的源进程
用户态局限性
用户态下无法直接获取终止操作的源进程信息,因为TerminateProcess或NtTerminateProcess等终止API不会向目标进程传递调用者身份。
可行方案
- 内核级API监控:通过内核驱动拦截
NtTerminateProcess系统调用,调用时使用PsGetCurrentProcessId()获取发起终止操作的进程ID(PID),再通过PID查询进程名称(如taskmgr.exe)。这种方式能准确识别源进程,但开发和部署门槛高。 - ETW事件追踪:启用
Microsoft-Windows-Kernel-Process事件提供者,监听ProcessTerminate事件。该事件会包含被终止进程的PID和发起终止的进程PID,解析事件数据即可关联到源进程。此方法需要管理员权限,且需实时监听事件流。
关键限制说明
- 任务管理器的「强制结束进程」操作会直接终止进程所有线程,用户态程序几乎没有时间执行检测逻辑,仅内核方案能捕获此类操作。
- 内核驱动必须满足Windows的签名要求,否则无法在生产环境运行。
- 若任务管理器以管理员权限运行,普通权限的用户态监控方案无法生效。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

