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;
}
效果图
相关文章
- C++ 遍历进程内存块
- C++ 遍历驱动列表(应用层下)
- qt实现web服务器加载vue应用进行C++和html混合编程-连载【6】-企业级系统开发实战连载系列 -技术栈(vue、element-ui、qt、c++、sqlite)
- 托管C++线程锁实现 c++11线程池
- 大话设计模式C++版——代理模式
- C/C++glob函数遍历文件夹所有文件
- 87 C++ - 常用遍历算法
- C++程序设计:原理与实践(进阶篇)17.5 坐标系
- C++中反向遍历map时怎样删除元素
- 《C和C++代码精粹》——第 1 章 更好的C1.1 两种语言简述
- 【C++】二叉树之力扣经典题目1——详解二叉树的递归遍历,二叉树的层次遍历
- C++实现对数学基本运算表达式的解析
- 理清gcc、libc、libstdc++的关系(libstdc++是gcc搞的,libc++是llvm搞的,他们都是C++标准库的实现)
- C++11(及现代C++风格)和快速迭代式开发
- QT跟VC++结合来进行插件的验证机制(遍历vtable,保证虚函数的个数一致,也可使用Q_INVOKABLE宏定义)
- 《c++语言导学》——2.4 联合
- C/C++之(一)洛谷刷题及洛谷评测
- linux下使用C++ Json库
- C++提取出std::map中的key集合
- 123、【回溯算法】leetcode ——491. 递增子序列:unordered_set去重和int数组去重(C++版本)
- 113、【树与二叉树】leetcode ——538. 把二叉搜索树转换为累加树:递增数组视角右中左遍历(C++版本)
- 100、【树与二叉树】leetcode ——105. 从前序与中序遍历序列构造二叉树+106. 从中序与后序遍历序列构造二叉树(C++版本)
- 97、【树与二叉树】leetcode ——513.找树左下角的值:层次遍历+回溯法(C++版本)
- 90、【树与二叉树】leetcode ——104. 二叉树的最大深度:层次遍历+DFS+子问题分解(C++版本)
- 88、【树与二叉树】leetcode ——226. 翻转二叉树:先中后序的递归与DFS非递归遍历+BFS层次遍历(C++版本)
- C++使用opencv遍历文件夹