0
点赞
收藏
分享

微信扫一扫

C++ 遍历 MiniFilter

目的

实现一个类似 PCHunter 中的一个功能:

C++ 遍历 MiniFilter_#ifdef

代码

功能参考:​​https://write-bug.com/article/2503.html​​​ 其余参考​

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

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

// 判断系统给版本
if (6 == osInfo.dwMajorVersion){
// Win7
if (1 == osInfo.dwMinorVersion){
#ifdef
// 64 位
lOperationsOffset = 0x188;
#else
// 32 位
lOperationsOffset = 0xCC;
#endif
}
// Win8
else if (2 == osInfo.dwMinorVersion){
#ifdef
// 64 位
#else
// 32 位
#endif
}
// Win8.1
else if (3 == osInfo.dwMinorVersion){
#ifdef
// 64 位
lOperationsOffset = 0x198;
#else
// 32 位
lOperationsOffset = 0xD4;
#endif
}
}
// Win10
else if (10 == osInfo.dwMajorVersion){
#ifdef
// 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;
}

效果图

C++ 遍历 MiniFilter_数组长度_02



举报

相关推荐

0 条评论