c-PsLookupProcessByProcessId返回STATUS_SUCCESS,即使pid错误



我正在从驱动程序中检查我的用户模式应用程序是否仍在运行,在执行此操作时,我使用PsLookupProcessByProcessId来检查进程是否仍然存在。它在一开始就起作用,但即使在我关闭我的进程,并且没有其他进程具有相同的pid之后,我仍然会得到STATUS_SUCCESS。以前有人遇到过这种行为吗?我正在Windows20h2上运行以测试我的驱动程序

我的代码的片段

NTSTATUS status = PsLookupProcessByProcessId((HANDLE)UserModePid, &UserModeProcess);
if (status == STATUS_INVALID_PARAMETER) {
DbgPrintEx(0, 0, "[Driver] Invalid Processn");
ExitKernel();
}
else {
DbgPrintEx(0, 0, "[Driver] Status : %llx", status);
}

为我糟糕的英语提前道歉:(

进程退出时,Windows不会立即释放EPROCESS,而是将其保留一段时间(因为引用计数尚未减少到0(。

以下代码可以很好地确定进程是否已退出(从Blackbone复制(:

/// <summary>
/// Check if process is terminating
/// </summary>
/// <param name="imageBase">Process</param>
/// <returns>If TRUE - terminating</returns>
BOOLEAN BBCheckProcessTermination( PEPROCESS pProcess )
{
LARGE_INTEGER zeroTime = { 0 };
return KeWaitForSingleObject( pProcess, Executive, KernelMode, FALSE, &zeroTime ) == STATUS_WAIT_0;
}

结合您的代码:

bool IsTerminated;
NTSTATUS Status = PsLookupProcessByProcessId((HANDLE)LoaderPid, &LoaderProccess);
if (!NT_SUCCESS(Status)) {
IsTerminated = true;
}
else {
IsTerminated = BBCheckProcessTermination(LoaderProccess);
ObDereferenceObject(LoaderProccess);
}
if (IsTerminated) {
DbgPrintEx(0, 0, "[Driver] Invalid Processn");
ExitKernel();
}
else {
DbgPrintEx(0, 0, "[Driver] Status : %llx", Status);
}

如果以上代码不起作用,您也可以尝试:

IsTerminated = PsGetProcessExitStatus(LoaderProccess) != STATUS_PENDING;

如果它仍然不起作用,我可以提供的最后一个解决方案是使用ZwQuerySystemInformation来枚举进程,并检查您的进程是否在链表中。

最新更新