我正在设置一个PLOAD_IMAGE_NOTIFY_ROUTINE以检测特定的图像名称,如果匹配,则终止它。不过,我得到了一份KERNEL_APC_PENDING_DURING_EXIT。BSOD发生在我的KillProcess函数中,它只是用ObOpenObjectByPointer打开一个内核句柄,然后在这个句柄上调用ZwTerminateProcess。
有什么不对的?代码在例程之外运行良好。我必须把它寄出去吗?当我打电话给PLOAD_IMAGE_NOTIFY_ROUTINE时,我在KillProcess中得到了一个BSOD。
下面是我的KillProcess函数:
NTSTATUS KillProcess(HANDLE ProcessId)
{
PEPROCESS Process;
HANDLE newProcessHandle = NULL;
NTSTATUS status = PsLookupProcessByProcessId(ProcessId, &Process);
do
{
if (!NT_SUCCESS(status))
{
#ifdef DEBUGPRINT
DbgPrint("Process with id %d does not exist\n", ProcessId);
#endif
break;
}
if (NT_SUCCESS(status = ObOpenObjectByPointer(
Process,
OBJ_KERNEL_HANDLE,
NULL,
PROCESS_TERMINATE,
*PsProcessType,
KernelMode,
&newProcessHandle
)))
{
if (newProcessHandle != NULL)
{
status = ZwTerminateProcess(newProcessHandle, 0);
ZwClose(newProcessHandle);
}
else
{
ObDereferenceObject(Process);
break;
}
if (NT_SUCCESS(status))
{
#ifdef DEBUGPRINT
DbgPrint("Successfully killed process with id %d\n", ProcessId);
#endif
}
else
{
#ifdef DEBUGPRINT
DbgPrint("Failed to kill process with id %d\n", ProcessId);
#endif
}
}
else
{
#ifdef DEBUGPRINT
DbgPrint("Failed to open process with id %d\n", ProcessId);
#endif
}
ObDereferenceObject(Process);
} while (FALSE);
return status;
}发布于 2016-07-01 10:55:03
问题是,我试图在自己的背景下终止这一进程,这导致了一个BSOD。解决方案:
发布于 2016-06-28 01:10:00
PsSetLoadImageNotifyRoutine文档说:
当加载新创建的进程的主可执行映像时,加载图像通知例程将在新进程的上下文中运行。
(在加载DLL时,调用也很可能是在加载DLL的进程的上下文中进行的。)
因此,从它的声音来看,您正在终止正在运行其上下文的进程。更重要的是,在映像加载操作的回调过程中,您会在一个特别脆弱的点执行此操作。这引起麻烦也就不足为奇了。
ZwTerminateProcess文档意味着驱动程序可以终止当前进程,前提是它确保资源已从内核堆栈中释放,但我认为这种情况不适用。(而且,我不知道你会怎么做。)
相反,可以挂起进程,并在稍后从系统线程中终止它。
https://stackoverflow.com/questions/38045401
复制相似问题