Windows内核驱动-进程回调
一、中心代码
总共三部分:
- 界说回调函数
- 注册回调
- 移除回调
#include <ntddk.h>
// 界说回调函数,在后续完成
VOID ProcessNotifyRoutine(
_Inout_ PEPROCESS Process, // 进程目标,这是个不透明结构,不主张强行运用其间的字段
_In_ HANDLE ProcessId, // 进程ID
_In_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo // 进程创立信息
);
// 界说卸载函数,在后续完成
NTSTATUS DriverUnload(_In_ PDRIVER_OBJECT DriverObject);
// 在DriverEntry中注册回调
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
UNREFERENCED_PARAMETER(RegistryPath); // 未运用的参数,需求UNREFERENCED_PARAMETER处理,不然会warning
NTSTATUS status;
// 注册卸载函数
DriverObject->DriverUnload = DriverUnload;
// 注册进程回调,第二个参数表明是否移除,true表明移除,false表明注册
status = PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutine, FALSE);
return STATUS_SUCCESS;
}
// 在卸载函数中移除回调
NTSTATUS DriverUnload(_In_ PDRIVER_OBJECT DriverObject)
{
UNREFERENCED_PARAMETER(DriverObject);
NTSTATUS status;
// 移除回调,第二个参数表明是否移除,true表明移除,false表明注册
status = PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutine, TRUE);
return status;
}
// 进程回调完成
VOID ProcessNotifyRoutine(
_Inout_ PEPROCESS Process, // 进程目标,这是个不透明结构,不主张强行运用其间的字段
_In_ HANDLE ProcessId, // 进程ID
_In_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo // 进程创立信息
)
{
UNREFERENCED_PARAMETER(Process);
UNREFERENCED_PARAMETER(ProcessId);
UNREFERENCED_PARAMETER(CreateInfo);
// 这儿能够记载进程的创立和毁掉
if (CreateInfo != NULL)
{
// 进程创立
// 假如需求阻挠进程创立,则能够
// 设置 CreateInfo 中的 CreationStatus 字段为 STATUS_ACCESS_DENIED
// CreateInfo->CreationStatus = STATUS_ACCESS_DENIED;
}
else
{
// 进程毁掉
}
}
二、要害操作
2.1 链接器设置
上述代码编译后,无法正确触发 ProcessNotifyRoutine
回调,需求为链接器添加参数:
/INTEGRITYCHECK
这一点需求侧重留意。
2.2 PsSetCreateProcessNotifyRoutineEx 注册回调
函数原型:
NTSTATUS
PsSetCreateProcessNotifyRoutineEx (
_In_ PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
_In_ BOOLEAN Remove
);
参数解说:
第一个参数:回调函数,当进程创立或许毁掉时会调用此函数,类型为 PCREATE_PROCESS_NOTIFY_ROUTINE_EX
第二个参数:是否移除,true表明移除,false表明注册
其间PCREATE_PROCESS_NOTIFY_ROUTINE_EX
界说为:
typedef
VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE_EX) (
_Inout_ PEPROCESS Process,
_In_ HANDLE ProcessId,
_Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo
);
PEPROCESS
是内核态进程目标,HANDLE
是进程ID,PPS_CREATE_NOTIFY_INFO
是进程创立信息,假如为NULL,表明进程毁掉,不然表明进程创立。
2.3 获取进程信息
如上的 PCREATE_PROCESS_NOTIFY_ROUTINE_EX
界说,咱们能够经过回调函数的 CreateInfo
参数获取进程相关信息。
PPS_CREATE_NOTIFY_INFO
界说如下:
typedef struct _PS_CREATE_NOTIFY_INFO {
_In_ SIZE_T Size;
union {
_In_ ULONG Flags;
struct {
_In_ ULONG FileOpenNameAvailable : 1;
_In_ ULONG Reserved : 31;
};
};
_In_ HANDLE ParentProcessId;
_In_ CLIENT_ID CreatingThreadId;
_Inout_ struct _FILE_OBJECT *FileObject;
_In_ PCUNICODE_STRING ImageFileName;
_In_opt_ PCUNICODE_STRING CommandLine;
_Inout_ NTSTATUS CreationStatus;
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
能够直接取得:
ParentProcessId
:父进程IDCreatingThreadId
:创立进程的线程IDFileObject
:文件目标,能够取得文件途径ImageFileName
:进程映像文件名,也便是可执行文件途径CommandLine
:进程发动命令行,假如为NULL,表明没有命令行,不然为命令行字符串
2.4 阻挠进程创立
PPS_CREATE_NOTIFY_INFO
中有一个 CreationStatus
字段,假如设置为 STATUS_ACCESS_DENIED
,则表明阻挠进程创立。
三、参考资料
[1] Windows 内核不透明结构
[2] PsSetCreateProcessNotifyRoutineEx 函数 (ntddk.h)
[3] PCREATE_PROCESS_NOTIFY_ROUTINE_EX回调函数 (ntddk.h)
[4] PS_CREATE_NOTIFY_INFO 结构 (ntddk.h)