-
-
[求助]通过PsSetCreateProcessNotifyRoutineEx回调拦截进程导致内核句柄泄漏
-
-
[求助]通过PsSetCreateProcessNotifyRoutineEx回调拦截进程导致内核句柄泄漏
Win10 22h2系统上通过PsSetCreateProcessNotifyRoutineEx注册回调函数拦截特定进程的创建,正常情况下拦截正常,不存在句柄泄漏问题。
```c++
// 回调函数
VOID NotifyOnCreateProcess(_Inout_ PEPROCESS proc, _In_ HANDLE pid, _Inout_opt_ PPS_CREATE_NOTIFY_INFO create_info) {
if (create_info) {
PCSTR proc_name = (PCSTR)PsGetProcessImageFileName((proc));
if (proc_name) {
if (FilterProcessCmdLine(create_info->ParentProcessId, proc_name, proc_cmd)) {
create_info->CreationStatus = STATUS_ACCESS_DENIED;
}
}
}
}
```
但是使用多线程压测时会发现内存占用异常上涨,使用poolmon监控可以发现Tag=Toke池的内存上涨后无法释放,怀疑存在token句柄泄漏的情况。
通过任务管理器查看句柄总数,未发现明显增长,说明不是用户态句柄泄漏导致的。


开启对象引用追踪,使用!obtrace追踪所有创建进程的主令牌,可以发现大量进程的token在进程销毁会仍然存在引用,导致对象无法释放,
同样的驱动在win11 24h2上使用poolmon未发现问题。
补充说明:直接使用命令行多进程执行的情况下,不存在泄漏,但是使用C++ std::thread在子线程中执行就会发生(和子线程数量无关)。
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 2025-7-11 10:59
被mb_yorfaxrs编辑
,原因: