zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++ 遍历 MiniFilter

2023-09-11 14:13:59 时间

目的

实现一个类似 PCHunter 中的一个功能:
在这里插入图片描述

代码

功能参考:https://write-bug.com/article/2503.html
其余参考:https://blog.csdn.net/Simon798/article/details/103308039

// 获取 Operations 偏移
LONG GetOperationsOffset(){
	// 初始化
	RTL_OSVERSIONINFOW osInfo = { 0 };
	LONG lOperationsOffset = 0;

	// 获取系统版本信息
	RtlGetVersion(&osInfo);

	// 判断系统给版本
	if (6 == osInfo.dwMajorVersion){
		// Win7
		if (1 == osInfo.dwMinorVersion){
#ifdef _WIN64
			// 64 位
			lOperationsOffset = 0x188;
#else
			// 32 位
			lOperationsOffset = 0xCC;
#endif    
		}
		// Win8
		else if (2 == osInfo.dwMinorVersion){
#ifdef _WIN64
			// 64 位
#else
			// 32 位
#endif
		}
		// Win8.1
		else if (3 == osInfo.dwMinorVersion){
#ifdef _WIN64
			// 64 位
			lOperationsOffset = 0x198;
#else
			// 32 位
			lOperationsOffset = 0xD4;
#endif            
		}
	}
	// Win10
	else if (10 == osInfo.dwMajorVersion){
#ifdef _WIN64
		// 64 位
		lOperationsOffset = 0x1A8;
#else
		// 32 位
		lOperationsOffset = 0xE4;
#endif
	}

	return lOperationsOffset;
}

// 遍历 MiniFilter
NTSTATUS EnumMiniFilter() {
	// 定义返回值
	NTSTATUS status;

	// 获取 Minifilter 数量
	ULONG ul_fliterList_size = 0;
	FltEnumerateFilters(NULL, 0, &ul_fliterList_size);

	// 申请内存
	PFLT_FILTER* pp_fliterList = NULL;
	pp_fliterList = (PFLT_FILTER*)ExAllocatePoolWithTag(
		NonPagedPool,								// 非分页内存
		ul_fliterList_size * sizeof(PFLT_FILTER),	// 分配的字节数
		'T_1'										// 内存空间标识
	);
	if (pp_fliterList == NULL){
		DbgPrint("ExAllocatePoolWithTag error:%X", STATUS_INSUFFICIENT_RESOURCES);
		return STATUS_INSUFFICIENT_RESOURCES;
	}

	// 获取 Minifilter 中所有 Filter 的信息
	status = FltEnumerateFilters(
		pp_fliterList,				// 接受 PFLT_FILTER 数组
		ul_fliterList_size,			// 数组长度
		&ul_fliterList_size			// 接收实际数组长度
	);
	if (!NT_SUCCESS(status)){
		DbgPrint("FltEnumerateFilters error:%X", status);
		return status;
	}
	DbgPrint("ul_fliterList_size = %d", ul_fliterList_size);

	// 遍历 Minifilter
	PFLT_OPERATION_REGISTRATION p_FOR = NULL;
	for (ULONG i = 0; i < ul_fliterList_size; i++) {
		// 获取 PFLT_FILTER 中 Operations 成员地址
		p_FOR = (PFLT_OPERATION_REGISTRATION)(*(PVOID*)((UCHAR*)pp_fliterList[i] + GetOperationsOffset()));

		// 遍历回调函数
		while (p_FOR->MajorFunction != IRP_MJ_OPERATION_END) {
			// 打印
			DbgPrint("[Filter = %p]IRP = %d, PreFunc = 0x%p, PostFunc = 0x%p",
				pp_fliterList[i],
				p_FOR->MajorFunction,
				p_FOR->PreOperation,
				p_FOR->PostOperation
			);

			// 获取下一个消息回调信息
			p_FOR = (PFLT_OPERATION_REGISTRATION)((UCHAR*)p_FOR + sizeof(FLT_OPERATION_REGISTRATION));
		}

	}

	// 释放内存
	ExFreePool(pp_fliterList);

	return STATUS_SUCCESS;
}

效果图

在这里插入图片描述