当前位置:首页 > 操作系统 > 正文内容

Windows内核驱动-进程回调

邻居的猫1个月前 (12-09)操作系统1623

一、中心代码

总共三部分:

  1. 界说回调函数
  2. 注册回调
  3. 移除回调
#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:父进程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)

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=599

分享给朋友:

“Windows内核驱动-进程回调” 的相关文章

windows修复,Windows系统故障排除与修复指南

windows修复,Windows系统故障排除与修复指南

Windows 修复通常涉及对操作系统进行故障排除和可能的修复。这可以通过多种方法实现,包括但不限于以下几种:1. 系统还原:如果你有创建系统还原点,可以使用系统还原来将Windows恢复到之前的状态。2. 启动修复:如果你的电脑无法正常启动,可以使用Windows安装盘或Windows恢复环境中的...

macos截图,macos系统下载官网

在MacOS上截图有几种不同的方法,以下是几种常用的方式:1. 全屏截图:按下`Shift Command 3`。截图会自动保存到桌面。2. 自定义区域截图:按下`Shift Command 4`,然后拖动鼠标选择要截图的区域。截图会自动保存到桌面。3. 窗口截图:按下`Shif...

linux当前时间,获取当前时间

linux当前时间,获取当前时间

当前时间是2024年12月11日03:08:43。Linux系统中的当前时间获取与设置在Linux系统中,了解和设置当前时间是进行系统管理和日常操作的基础。本文将详细介绍如何在Linux系统中获取当前时间、设置系统时间以及使用定时任务等功能。获取当前时间Linux系统中,有多种命令可以用来获取当前时...

linux学习,Linux简介

1. 基础知识: 学习Linux的基本概念,如文件系统、进程、用户和权限等。 了解Linux的命令行界面(CLI)和常用命令,如`ls`、`cd`、`cp`、`mv`、`rm`、`mkdir`、`chmod`、`chown`、`man`等。 学习如何使用文本编辑器,如`vi`或`n...

linux重命名文件夹

在Linux中,你可以使用`mv`命令来重命名文件夹。以下是一个基本的步骤说明:1. 打开终端。2. 使用`cd`命令导航到包含你想要重命名的文件夹的目录。3. 使用以下命令来重命名文件夹: ``` mv 原始文件夹名 新文件夹名 ```例如,如果你想要将名为`old_folder`的文...

电脑不激活windows会怎么样,电脑不激活Windows的后果及影响

电脑不激活windows会怎么样,电脑不激活Windows的后果及影响

1. 水印:未激活的Windows系统会在桌面背景上显示水印,提示用户需要激活操作系统。2. 功能限制:某些功能可能会受到限制,例如个性化设置、主题更改等。3. 安全更新:未激活的Windows系统可能无法接收最新的安全更新,这可能会导致系统更容易受到病毒和恶意软件的攻击。4. 性能问题:未激活的W...