首页
社区
课程
招聘
[原创]win10 1909逆向(MiniFilter原理剖析2---FltRegisterFilter(注册))
发表于: 2021-4-16 21:01 19132

[原创]win10 1909逆向(MiniFilter原理剖析2---FltRegisterFilter(注册))

2021-4-16 21:01
19132

接上篇win10 1909逆向(MiniFilter原理剖析1---FltMgr的初始化)


status = FltRegisterFilter( DriverObject, &FilterRegistration,&gFilterHandle );

FLT_REGISTRATION-----------------------微过滤器注册结构(用户自已填写)

FLT_FILTER----------------------------------微过滤器对象结构(在注册阶段,由系统根据FLT_REGISTRATION结构填写)

// Filter管理器还没有初始化就调用注册函数。需要确保 filter管理器已经作为一个驱动启动了

 if ( !(GLOBALS->Gflags & 1) )                           // dt _FLTMGR!_GLOBALS 微过滤器的全局结构

   return STATUS_FLT_NOT_INITIALIZED;  

FltMgr管理器的全局结构,后续会多次用到。


// 判断版本号,次版本号可以忽略,但主版本号必须正确

if ((Registration->Version & 0xFF00) != FLT_MAJOR_VERSION)

{

return STATUS_INVALID_PARAMETER;

}

//判断命名回调组合

if ((!Registration->GenerateFileNameCallback && Registration->NormalizeNameComponentCallback) ||

(!Registration->NormalizeNameComponentCallback && Registration->NormalizeContextCleanupCallback))

{

return STATUS_INVALID_PARAMETER;

}

//得到回调函数集合地址

Callbacks = (PFLT_OPERATION_REGISTRATION)Registration->OperationRegistration;

//计算当前回调函数集合有几个回调

while (Callbacks)

{

Count++;

if (Callbacks->MajorFunction == IRP_MJ_OPERATION_END)

break;

Callbacks++;

}

//计算过滤器缓存结构大小

CallbackBufferSize = Count * sizeof(FLT_OPERATION_REGISTRATION);

FilterBufferSize = sizeof(FLT_FILTER) +

CallbackBufferSize +

DriverObject->DriverExtension->ServiceKeyName.Length;

//分配一个块空间来保存我们的过滤器缓存结构

Filter = ExAllocatePoolWithTag(NonPagedPoolNx,FilterBufferSize,FM_TAG_FILTER);

if (Filter == NULL) return STATUS_INSUFFICIENT_RESOURCES;

RtlZeroMemory(Filter, FilterBufferSize);

//设置回调地址,将注册结构的回调地址复制到Filter对象里

Filter->FilterUnload = Registration->FilterUnloadCallback;

Filter->InstanceSetup = Registration->InstanceSetupCallback;

Filter->InstanceQueryTeardown = Registration->InstanceQueryTeardownCallback;

Filter->InstanceTeardownStart = Registration->InstanceTeardownStartCallback;

Filter->InstanceTeardownComplete = Registration->InstanceTeardownCompleteCallback;

Filter->GenerateFileName = Registration->GenerateFileNameCallback;

Filter->NormalizeNameComponent = Registration->NormalizeNameComponentCallback;

Filter->NormalizeContextCleanup = Registration->NormalizeContextCleanupCallback;

UINT64 Version=Registration->Version;

if ( Version>= 0x201 )  //Vista Beta 2以上

   {

     Filter->KtmNotification= Registration->TransactionNotificationCallback;

     Version = Registration->Version;

   }

if ( Version>= 0x202 )  //Vista RTM以上

   {

    Filter->NormalizeNameComponentEx= Registration->NormalizeNameComponentExCallback;

     Version = Registration->Version;

   }

if ( Version>= 0x203 )  //Win 8以上

   {

    Filter->SectionNotification= Registration->SectionNotificationCallback;

    if(Registration->Flags & FLTFL_REGISTRATION_SUPPORT_NPFS_MSFS)   //如果已设置,则此筛选器可识别命名管道和邮件槽筛选

       {

                 Filter->Flags | = FLTFL_SUPPORTS_PIPES_MAILSLOTS;  

       }

   }

if(Registration->Flags & FLTFL_REGISTRATION_SUPPORT_DAX_VOLUME)  //如果已设置,则此筛选器将识别DAX卷,即支持直接在永久内存

  {                                                                                                                           //设备上映射文件的卷。对于这样的卷,缓存和内存映射到用户

         Filter->Flags | = FLTFL_SUPPORTS_DAX_VOLUME;                               //文件的IO不会生成分页IO。

  }

//Ptr是FilterBuffer结构的一部分,里面会存放Flt_Registration里的OperationRegistration的数据,然后将ptr的地址放进_FLT_FILTER->Operation

Ptr = (PCHAR)(Filter + 1);

Filter->Base.Flags = FLT_OBFL_TYPE_FILTER;   //设置类型

Filter->Base.PointerCount = 1;  //引向次数+1

ExInitializeRundownProtection(&Filter->Base.RundownRef); //初始化停止运行保护机制

//初始化

Filter->Base.PrimaryLink=0;

Filter->UniqueIdentifier.Data1=0;

Filter->UniqueIdentifier.Data2=0;

Filter->UniqueIdentifier.Data3=0;

Filter->UniqueIdentifier.Data4=0;

FltObjectReference(&Filter->Base);  //锁住保护Filter

Filter->DriverObject = DriverObject;

//初始化各个链表

ExInitializeResourceLite(&Filter->InstanceList.rLock);

InitializeListHead(&Filter->InstanceList.rList);

Filter->InstanceList.rCount = 0;

ExInitializeFastMutex(&Filter->ActiveOpens.mLock);

InitializeListHead(&Filter->ActiveOpens.mList);

Filter->ActiveOpens.mCount = 0;

ExInitializeFastMutex(&Filter->ConnectionList.mLock);

InitializeListHead(&Filter->ConnectionList.mList);


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (4)
雪    币: 2428
活跃值: (2566)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
豆总牛逼我也一直想逆逆这块,但没啥时间。希望豆总后面也讲讲Fltmgr.sys收到irp或者fastio请求后怎么封装成FLT_CALLBACK_DATA并分发给各个altitude的minifilter的?precallback和postcallback的调用时机和拦截原理(返回FLT_PREOP_SUCCESS_NO_CALLBACK/FLT_PREOP_COMPLETE的效果如何实现),卷绑定的实现原理之类的
2021-4-19 09:50
0
雪    币: 198
活跃值: (8548)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
dearfuture 豆总牛逼[em_63]我也一直想逆逆这块,但没啥时间。希望豆总后面也讲讲Fltmgr.sys收到irp或者fastio请求后怎么封装成FLT_CALLBACK_DATA并分发给各个altitude的m ...
你可真想累死我
2021-4-20 10:53
0
雪    币: 503
活跃值: (856)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
牛逼啊
2022-2-16 12:36
0
雪    币: 341
活跃值: (1005)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5

环境:

注册过滤器之后,可以得到一个FLT_FILTER指针,根据该结构体中Base.PrimaryLink列表可以获取所有的FLT_FILTER,然后可以尝试卸载。

2022-6-17 16:28
0
游客
登录 | 注册 方可回帖
返回
//