拦截Minifilter与应用层通信的FltMessage

FltCreateCommunicationPort 函数在内核中创建Minifilter的ServerPort;

我们要Hook的回调函数MessageNotify,就在ServerPort结构中

 typedef struct _FLT_SERVER_PORT_OBJECT
 {
     LIST_ENTRY FilterLink;
     PFLT_CONNECT_NOTIFY ConnectNotify;
     PFLT_DISCONNECT_NOTIFY DisconnectNotify;
     PFLT_MESSAGE_NOTIFY MessageNotify;
     PFLT_FILTER Filter;
     PVOID Cookie;
     ULONG Flags;
     LONG NumberOfConnections;
     LONG MaxConnections;
 } FLT_SERVER_PORT_OBJECT, *PFLT_SERVER_PORT_OBJECT;

获取这个结构有两种思路

一种是根据Server端口名和ObReferenceObjectByName函数直接获取,比较麻烦的是对象类型是未公开的,需要动态获取,对象类型名称是FilterConnectionPort;

// 尝试获取目标filter类型
    FilterConnectionPort = GetObjectType(L"FilterConnectionPort");
    if(FilterConnectionPort)
    {
        RtlInitUnicodeString(&usFilterName,  L"\\KernelFilterPort");
        NtStatus = ObReferenceObjectByName(&usFilterName,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,FilterConnectionPort,KernelMode,NULL,(PVOID*)&pServerPort);
        if(NT_SUCCESS(NtStatus))
        {
            DbgPrint("FltServerPort=%p FltMessage=%p FltConnect=%p FltDisConnect=%p\n",
                pServerPort, 
                pServerPort->MessageNotify,
                pServerPort->ConnectNotify,
                pServerPort->DisconnectNotify
                );
            ObDereferenceObject(pServerPort);
        }
    }

第二种是通过FltEnumerateFilters函数,枚举所有Minifilter,得到_FLT_FILTER数组,该结构九二一根据名字判断是不是目标filter驱动

fltmgr!_FLT_FILTER
   +0x000 Base             : _FLT_OBJECT
   +0x020 Frame            : 0xfffffa80`31441630 _FLTP_FRAME
   +0x028 Name             : _UNICODE_STRING "TestDrv"
   +0x038 DefaultAltitude  : _UNICODE_STRING "168108"
   +0x048 Flags            : 2 ( FLTFL_FILTERING_INITIATED )
   +0x050 DriverObject     : 0xfffffa80`326b7ca0 _DRIVER_OBJECT
   +0x058 InstanceList     : _FLT_RESOURCE_LIST_HEAD
   +0x0d8 VerifierExtension : (null) 
   +0x0e0 VerifiedFiltersLink : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]
   +0x0f0 FilterUnload     : 0xfffff880`038011d0     long  TestDrv!PtUnload+0
   +0x0f8 InstanceSetup    : (null) 
   +0x100 InstanceQueryTeardown : (null) 
   +0x108 InstanceTeardownStart : (null) 
   +0x110 InstanceTeardownComplete : (null) 
   +0x118 SupportedContextsListHead : (null) 
   +0x120 SupportedContexts : [6] (null) 
   +0x150 PreVolumeMount   : (null) 
   +0x158 PostVolumeMount  : (null) 
   +0x160 GenerateFileName : (null) 
   +0x168 NormalizeNameComponent : (null) 
   +0x170 NormalizeNameComponentEx : (null) 
   +0x178 NormalizeContextCleanup : (null) 
   +0x180 KtmNotification  : (null) 
   +0x188 Operations       : 0xfffffa80`32f493a0 _FLT_OPERATION_REGISTRATION
   +0x190 OldDriverUnload  : (null) 
   +0x198 ActiveOpens      : _FLT_MUTEX_LIST_HEAD
   +0x1e8 ConnectionList   : _FLT_MUTEX_LIST_HEAD   
   +0x238 PortList         : _FLT_MUTEX_LIST_HEAD
   +0x288 PortLock         : _EX_PUSH_LOCK

在该结构的ConnectionList.m_list字段中保存的是一个双向链表,刚好是_FLT_SERVER_PORT_OBJECT结构的FilterLink

3: kd> dx -id 0,0,fffffa8030ef1040 -r1 (*((fltmgr!_FLT_MUTEX_LIST_HEAD *)0xfffffa8032f492f8))
(*((fltmgr!_FLT_MUTEX_LIST_HEAD *)0xfffffa8032f492f8))                 [Type: _FLT_MUTEX_LIST_HEAD]
    [+0x000] mLock            [Type: _FAST_MUTEX]
    [+0x038] mList            [Type: _LIST_ENTRY]  -------->  双向链表 _FLT_SERVER_PORT_OBJECT
    [+0x048] mCount           : 0x2 [Type: unsigned long]
    [+0x048 ( 0: 0)] mInvalid         : 0x0 [Type: unsigned char]


 typedef struct _FLT_SERVER_PORT_OBJECT
 {
     LIST_ENTRY FilterLink;
     PFLT_CONNECT_NOTIFY ConnectNotify;
     PFLT_DISCONNECT_NOTIFY DisconnectNotify;
     PFLT_MESSAGE_NOTIFY MessageNotify;
     PFLT_FILTER Filter;
     PVOID Cookie;
     ULONG Flags;
     LONG NumberOfConnections;
     LONG MaxConnections;
 } FLT_SERVER_PORT_OBJECT, *PFLT_SERVER_PORT_OBJECT;

参考FltCreateCommunicationPort函数实现代码片段

/* Insert the object */
         Status = ObInsertObject(PortObject,
                                 NULL,
                                 STANDARD_RIGHTS_ALL | FILE_READ_DATA,
                                 0,
                                 NULL,
                                 (PHANDLE)ServerPort);
         if (NT_SUCCESS(Status))
         {
             /* Lock the connection list */
             ExAcquireFastMutex(&Filter->ConnectionList.mLock);
 
             /* Add the new port object to the connection list and increment the count */
             InsertTailList(&Filter->ConnectionList.mList, &PortObject->FilterLink);
             Filter->ConnectionList.mCount++;
 
             /* Unlock the connection list*/
             ExReleaseFastMutex(&Filter->ConnectionList.mLock);
         }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Minifilter是Windows操作系统中的一个内核模块,它可以对文件系统I/O操作进行监控和过滤,提供一定程度的文件系统访问控制和文件操作的修改能力。minifilter可以在文件系统级别实现对文件的读写访问控制、文件内容加密、文件过滤等功能。 minifilter的下载通常分为两个步骤:首先需要下载Windows Driver Kit(WDK)或Windows SDK,以获取minifilter开发所需的工具和库文件;其次,可以根据自己的具体需求编写或下载现有的minifilter源代码。 WDK或Windows SDK是微软提供的一套开发工具,它包含了开发Windows驱动程序所需的一系列工具、示例代码、库文件和文档等,可以用于minifilter开发及其他相关驱动程序的开发。 一般来说,在微软官网上可以找到WDK或Windows SDK的下载链接,用户可以根据自己的操作系统版本和开发环境选择合适的版本进行下载安装。安装完成后,用户可以在Windows开发环境中配置相应的环境变量,然后就可以使用WDK或Windows SDK提供的工具和库文件进行minifilter开发。 另外,也可以通过搜索引擎或开源社区等途径,找到已经编写好的minifilter源代码,并根据需要进行下载和修改。这种方式适用于一些常见的minifilter功能,如文件加密、病毒扫描等,可以节省开发时间和工作量。 总之,minifilter的下载需要获取Windows Driver Kit或Windows SDK,然后可以通过官方渠道或开源社区获取minifilter的源代码,以进行开发和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值