C++ 遍历 MiniFilter

目的

实现一个类似 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;
}

效果图

在这里插入图片描述

原文链接: https://www.cnblogs.com/csnd/p/15613481.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ 遍历 MiniFilter

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/347356

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午4:28
下一篇 2023年3月2日 上午4:28

相关推荐