如何在Windows内核模式驱动中获取进程的PHANDLE?
Windows内核模式下终止进程的正确姿势
内核驱动开发里确实不能用用户态的OpenProcess(),也绝对不能引入windows.h——那是给用户态程序用的,内核层只需要包含ntddk.h就够了。要终止进程,得用内核原生的API,步骤如下:
第一步:准备打开进程所需的结构体
内核里打开进程需要OBJECT_ATTRIBUTES和CLIENT_ID两个结构体,这俩在ntddk.h里都有定义,不用额外头文件。第二步:用
ZwOpenProcess获取进程句柄
这个函数是内核版的“打开进程”,需要指定目标进程的PID,以及所需的权限(比如终止进程需要PROCESS_TERMINATE权限)。第三步:用
ZwTerminateProcess终止进程
拿到合法的进程句柄后,调用这个函数就能终止目标进程。第四步:关闭句柄
内核里打开的句柄必须手动关闭,用ZwClose。
代码示例
#include <ntddk.h> NTSTATUS TerminateTargetProcess(HANDLE ProcessId) { NTSTATUS status; HANDLE hProcess = NULL; OBJECT_ATTRIBUTES objAttr; CLIENT_ID clientId; // 初始化OBJECT_ATTRIBUTES,这里不需要命名对象,所以设为NULL InitializeObjectAttributes(&objAttr, NULL, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL); // 设置目标进程的PID clientId.UniqueProcess = ProcessId; clientId.UniqueThread = NULL; // 打开进程,请求终止权限 status = ZwOpenProcess(&hProcess, PROCESS_TERMINATE, &objAttr, &clientId); if (!NT_SUCCESS(status)) { DbgPrint("ZwOpenProcess failed, status: 0x%X\n", status); return status; } // 终止进程,第二个参数是退出码,一般设为0即可 status = ZwTerminateProcess(hProcess, 0); if (!NT_SUCCESS(status)) { DbgPrint("ZwTerminateProcess failed, status: 0x%X\n", status); ZwClose(hProcess); return status; } // 关闭句柄 ZwClose(hProcess); return STATUS_SUCCESS; }
注意事项
- 内核驱动里所有Zw开头的API,调用前要确保你了解它的参数要求和返回值含义,比如
NT_SUCCESS()宏用来判断操作是否成功。 OBJ_KERNEL_HANDLE标志很重要,它表示这个句柄是内核模式句柄,不会被用户态程序访问到,更安全。- 要确保驱动有足够的权限去打开和终止目标进程,比如如果目标是系统进程,可能需要更高的权限或者特殊处理。
内容的提问来源于stack exchange,提问作者ZGuardian
相关产品推荐
相关产品推荐

