本章正如标题所言,主要讲了进程线程的通知回调相关的功能函数及其应用,主要如下:
1.进程回调
相关:
PsSetCreateProcessNotifyRoutineEx
(可以获取命令行等更多信息,创建注销是同一个函数)
PsSetCreateProcessNotifyRoutine
2.线程回调
相关:
PsSetCreateThreadNotifyRoutine
(创建)
PsSetCreateThreadNotifyRoutine
(注销)
3.映像回调
相关:
PsSetLoadImageNotifyRoutine
(创建)
PsSetLoadImageNotifyRoutine
(注销,没有回调机制)
有了以上的信息,简单使用进程相关的API进行监控进程创建,代码如下:
#include <ntddk.h>
NTSYSCALLAPI PCHAR PsGetProcessImageFileName(IN PEPROCESS pProcess);
VOID ProcessNotifyEx(
_Inout_ PEPROCESS Process,
_In_ HANDLE ProcessId,
_Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo
)
{
DbgPrint("ProcessNotifyEx: %s (%d)\n", PsGetProcessImageFileName(Process), HandleToULong(ProcessId));
}
NTSTATUS DriverUnload(
_In_ PDRIVER_OBJECT DriverObject
)
{
// 注销进程创建通知例程
PsSetCreateProcessNotifyRoutineEx(ProcessNotifyEx, TRUE);
DbgPrint("Driver unloaded successfully\n");
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
NTSTATUS status = STATUS_SUCCESS;
// 注册进程创建通知例程
status = PsSetCreateProcessNotifyRoutineEx(ProcessNotifyEx, FALSE);
if (!NT_SUCCESS(status))
{
DbgPrint("Failed to register process notify routine (status: %08x)\n", status);
return status;
}
DbgPrint("Driver loaded successfully\n");
DriverObject->DriverUnload = DriverUnload;
return status;
}
注意
使用这种回调函数的时候,是需要在链接器加入/INTEGRITYCHECK
才能正常的加载上驱动,也就是所说的绕过MmVerifyCallbackFunction
,此外还可以直接通过DriverSection->DriverSection->Flags |= 0x20
来过掉这个检测
参考资料:
《Windows 内核编程》作者: [美] 帕维尔·约西福维奇(Pavel Yosifovich)