找回密码
 立即注册
首页 业界区 安全 Windows内核驱动-进程回调

Windows内核驱动-进程回调

琴丁辰 2025-6-9 13:34:15
一、核心代码

一共三部分:

  • 定义回调函数
  • 注册回调
  • 移除回调
  1. #include <ntddk.h>
  2. // 定义回调函数,在后续实现
  3. VOID ProcessNotifyRoutine(
  4.         _Inout_ PEPROCESS Process,    // 进程对象,这是个不透明结构,不建议强行使用其中的字段
  5.         _In_ HANDLE ProcessId,        // 进程ID
  6.         _In_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo  // 进程创建信息
  7. );
  8. // 定义卸载函数,在后续实现
  9. NTSTATUS DriverUnload(_In_ PDRIVER_OBJECT DriverObject);
  10. // 在DriverEntry中注册回调
  11. NTSTATUS
  12. DriverEntry(
  13.         _In_ PDRIVER_OBJECT  DriverObject,
  14.         _In_ PUNICODE_STRING RegistryPath
  15. )
  16. {
  17.         UNREFERENCED_PARAMETER(RegistryPath); // 未使用的参数,需要UNREFERENCED_PARAMETER处理,不然会warning
  18.         NTSTATUS status;
  19.         // 注册卸载函数
  20.         DriverObject->DriverUnload = DriverUnload;
  21.         // 注册进程回调,第二个参数表示是否移除,true表示移除,false表示注册
  22.         status = PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutine, FALSE);
  23.         return STATUS_SUCCESS;
  24. }
  25. // 在卸载函数中移除回调
  26. NTSTATUS DriverUnload(_In_ PDRIVER_OBJECT DriverObject)
  27. {
  28.         UNREFERENCED_PARAMETER(DriverObject);
  29.         NTSTATUS status;
  30.         // 移除回调,第二个参数表示是否移除,true表示移除,false表示注册
  31.         status = PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutine, TRUE);
  32.         return status;
  33. }
  34. // 进程回调实现
  35. VOID ProcessNotifyRoutine(
  36.         _Inout_ PEPROCESS Process,    // 进程对象,这是个不透明结构,不建议强行使用其中的字段
  37.         _In_ HANDLE ProcessId,        // 进程ID
  38.         _In_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo  // 进程创建信息
  39.         )
  40. {
  41.         UNREFERENCED_PARAMETER(Process);
  42.         UNREFERENCED_PARAMETER(ProcessId);
  43.         UNREFERENCED_PARAMETER(CreateInfo);
  44.         // 这里可以记录进程的创建和销毁
  45.         if (CreateInfo != NULL)
  46.         {
  47.                 // 进程创建
  48.                 // 如果需要阻止进程创建,则可以
  49.                 // 设置 CreateInfo 中的 CreationStatus 字段为 STATUS_ACCESS_DENIED
  50.                
  51.                 // CreateInfo->CreationStatus = STATUS_ACCESS_DENIED;
  52.         }
  53.         else
  54.         {
  55.                 // 进程销毁
  56.         }
  57. }
复制代码
二、关键操作

2.1 链接器设置

上述代码编译后,无法正确触发 ProcessNotifyRoutine 回调,需要为链接器增加参数:
  1. /INTEGRITYCHECK
复制代码
这一点需要着重注意。
2.2 PsSetCreateProcessNotifyRoutineEx 注册回调

函数原型:
  1. NTSTATUS
  2. PsSetCreateProcessNotifyRoutineEx (
  3.     _In_ PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
  4.     _In_ BOOLEAN Remove
  5. );
复制代码
参数解释:
第一个参数:回调函数,当进程创建或者销毁时会调用此函数,类型为 PCREATE_PROCESS_NOTIFY_ROUTINE_EX
第二个参数:是否移除,true表示移除,false表示注册
其中PCREATE_PROCESS_NOTIFY_ROUTINE_EX 定义为:
  1. typedef
  2. VOID
  3. (*PCREATE_PROCESS_NOTIFY_ROUTINE_EX) (
  4.     _Inout_ PEPROCESS Process,
  5.     _In_ HANDLE ProcessId,
  6.     _Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo
  7.     );
复制代码
PEPROCESS 是内核态进程对象,HANDLE 是进程ID,PPS_CREATE_NOTIFY_INFO 是进程创建信息,如果为NULL,表示进程销毁,否则表示进程创建。
2.3 获取进程信息

如上的 PCREATE_PROCESS_NOTIFY_ROUTINE_EX 定义,我们可以通过回调函数的 CreateInfo 参数获取进程相关信息。
PPS_CREATE_NOTIFY_INFO 定义如下:
  1. typedef struct _PS_CREATE_NOTIFY_INFO {
  2.     _In_ SIZE_T Size;
  3.     union {
  4.         _In_ ULONG Flags;
  5.         struct {
  6.             _In_ ULONG FileOpenNameAvailable : 1;
  7.             _In_ ULONG Reserved : 31;
  8.         };
  9.     };
  10.     _In_ HANDLE ParentProcessId;
  11.     _In_ CLIENT_ID CreatingThreadId;
  12.     _Inout_ struct _FILE_OBJECT *FileObject;
  13.     _In_ PCUNICODE_STRING ImageFileName;
  14.     _In_opt_ PCUNICODE_STRING CommandLine;
  15.     _Inout_ NTSTATUS CreationStatus;
  16. } PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
复制代码
可以直接获得:

  • ParentProcessId:父进程ID
  • CreatingThreadId:创建进程的线程ID
  • FileObject:文件对象,可以获得文件路径
  • 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)

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册