首页
社区
课程
招聘
[原创]摘微过滤驱动回调的研究
发表于: 2022-9-29 15:45 13903

[原创]摘微过滤驱动回调的研究

2022-9-29 15:45
13903

下面是通过fltmc进行文件过滤驱动加载的常用命令。

写过MiniFIlter驱动的都知道FltUnregisterFilter用于注销回调。

但是MSDN中有这样一段话:

A minifilter driver can only call FltUnregisterFilter to unregister itself, not another minifilter driver.

意思就是驱动应该自身去调用这个函数,而不是使用其他微过滤驱动去调用。

为此我写了一个驱动去实验,发现再调用后驱动就在调用FltUnregisterFilter后一去不复返了。

在对这个函数进行下断后,发现PCHunter在调用移除过滤器后确实会调用FltUnregisterFilter。

上双机调试环境,把IDA拖入fltmgr,启动sync,Windbg 和 ret-sync联调。

先追踪一去不复返的原因。

经过调试发现ExWaitForRundownProtectionRelease 导致了函数的无限等待。

找到了这个原因,让我们看看MSDN,根据Remarks可知,需要通过调用ExReleaseRundownProtection 来释放保护,这个函数才能返回。

再次调试,看看这个对象的引用计数是怎样的。

在调用Remove之后,我们断在函数FltUnregisterFilter处:

第一个参数即是_FLT_FILTER 的指针

接下来我们看看相关的计数

可以看到再我们卸载时这个Count为0xC。

在调用ExWaitForRundownProtectionRelease 之前,我们再看一次计数

可以看到此时的计数是2。

那么我们接下来测试PCHunter。

再调用移除过滤器后我们也成功断在了入口处。

我们看一下引用计数,现在是0xa。

放过去,运行到调用ExWaitForRundownProtectionRelease 之前,发现引用计数变为了0。

因此PCHunter肯定是调用了ExReleaseRundownProtection去释放运行时保护。

Let’s try it!

关键代码如下:

重新编译驱动,下断。

第一次断下记录rcx

第二次断下查看计数,Ok! 效果和PCHunter一样了。

然后就成功移除掉了。

fltmc load DelProtect
fltmc unload DelProtect
fltmc load DelProtect
fltmc unload DelProtect
 
 
 
 
.load F:\github\ret-sync\ext_windbg\sync\x64\Release\sync.dll
!sync
bp fltmgr!FltUnregisterFilter
.load F:\github\ret-sync\ext_windbg\sync\x64\Release\sync.dll
!sync
bp fltmgr!FltUnregisterFilter
 
 
 
 
 
 
1: kd> g
Breakpoint 0 hit
fltmgr!FltUnregisterFilter:
fffff880`011bd6a0 488bc4          mov     rax,rsp
1: kd> r
rax=0000000000000000 rbx=fffffa8062f7cd10 rcx=fffffa80629a8430
rdx=fffff88003071126 rsi=fffffa8062a2b4c2 rdi=fffff88003071224
rip=fffff880011bd6a0 rsp=fffff880030710a8 rbp=fffff88003071b60
 r8=fffff88003071226  r9=0000000000000000 r10=fffff880009f1b20
r11=fffffa8062a2b4ae r12=0000000000000000 r13=0000000000000001
r14=0000000000000001 r15=fffffa806298a060
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
fltmgr!FltUnregisterFilter:
fffff880`011bd6a0 488bc4          mov     rax,rsp
1: kd> g
Breakpoint 0 hit
fltmgr!FltUnregisterFilter:
fffff880`011bd6a0 488bc4          mov     rax,rsp
1: kd> r
rax=0000000000000000 rbx=fffffa8062f7cd10 rcx=fffffa80629a8430
rdx=fffff88003071126 rsi=fffffa8062a2b4c2 rdi=fffff88003071224
rip=fffff880011bd6a0 rsp=fffff880030710a8 rbp=fffff88003071b60
 r8=fffff88003071226  r9=0000000000000000 r10=fffff880009f1b20
r11=fffffa8062a2b4ae r12=0000000000000000 r13=0000000000000001
r14=0000000000000001 r15=fffffa806298a060
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
fltmgr!FltUnregisterFilter:
fffff880`011bd6a0 488bc4          mov     rax,rsp
1: kd> dt fltmgr!_FLT_FILTER @rcx
   +0x000 Base             : _FLT_OBJECT
   +0x020 Frame            : 0xfffffa80`617afac0 _FLTP_FRAME
   +0x028 Name             : _UNICODE_STRING "DelProtect"
   +0x038 DefaultAltitude  : _UNICODE_STRING "345101"
   +0x048 Flags            : 2 ( FLTFL_FILTERING_INITIATED )
   +0x050 DriverObject     : 0xfffffa80`6140aa50 _DRIVER_OBJECT
   +0x058 InstanceList     : _FLT_RESOURCE_LIST_HEAD
   +0x0d8 VerifierExtension : (null)
   +0x0e0 VerifiedFiltersLink : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]
   +0x0f0 FilterUnload     : 0xfffff880`05076130     long  DelProtect!DelProtectUnload+0
   +0x0f8 InstanceSetup    : 0xfffff880`05076000     long  DelProtect!DelProtectInstanceSetup+0
   +0x100 InstanceQueryTeardown : 0xfffff880`050761a0     long  DelProtect!DelProtectInstanceQueryTeardown+0
   +0x108 InstanceTeardownStart : 0xfffff880`05076070     void  DelProtect!DelProtectInstanceTeardownStart+0
   +0x110 InstanceTeardownComplete : 0xfffff880`050760d0     void  DelProtect!DelProtectInstanceTeardownComplete+0
   +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`629a86c0 _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
1: kd> dt fltmgr!_FLT_FILTER @rcx
   +0x000 Base             : _FLT_OBJECT
   +0x020 Frame            : 0xfffffa80`617afac0 _FLTP_FRAME
   +0x028 Name             : _UNICODE_STRING "DelProtect"
   +0x038 DefaultAltitude  : _UNICODE_STRING "345101"
   +0x048 Flags            : 2 ( FLTFL_FILTERING_INITIATED )
   +0x050 DriverObject     : 0xfffffa80`6140aa50 _DRIVER_OBJECT
   +0x058 InstanceList     : _FLT_RESOURCE_LIST_HEAD
   +0x0d8 VerifierExtension : (null)
   +0x0e0 VerifiedFiltersLink : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]
   +0x0f0 FilterUnload     : 0xfffff880`05076130     long  DelProtect!DelProtectUnload+0
   +0x0f8 InstanceSetup    : 0xfffff880`05076000     long  DelProtect!DelProtectInstanceSetup+0
   +0x100 InstanceQueryTeardown : 0xfffff880`050761a0     long  DelProtect!DelProtectInstanceQueryTeardown+0
   +0x108 InstanceTeardownStart : 0xfffff880`05076070     void  DelProtect!DelProtectInstanceTeardownStart+0
   +0x110 InstanceTeardownComplete : 0xfffff880`050760d0     void  DelProtect!DelProtectInstanceTeardownComplete+0
   +0x118 SupportedContextsListHead : (null)
   +0x120 SupportedContexts : [6] (null)
   +0x150 PreVolumeMount   : (null)
   +0x158 PostVolumeMount  : (null)
   +0x160 GenerateFileName : (null)

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

收藏
免费 13
支持
分享
最新回复 (9)
雪    币: 6
活跃值: (3290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享,学习了
2022-9-29 19:49
0
雪    币: 844
活跃值: (9816)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
3
谢谢分享,学到了.
2022-9-30 10:20
0
雪    币: 1821
活跃值: (1913)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
什么情况下会出现这个现象 ?
2022-9-30 11:56
0
雪    币: 1907
活跃值: (5994)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
5
曹操abc 什么情况下会出现这个现象 ?
_FLT_OBJECT对象引用计数不为0
2022-9-30 12:15
0
雪    币: 1821
活跃值: (1913)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
VirtualCC _FLT_OBJECT对象引用计数不为0
可能我表达的不够清晰,正常情形下直接 FltUnregisterFilter 没碰到过这个现象,也是能正常卸载。在什么情形下会出现_FLT_OBJECT对象引用计数不为 0。 
2022-9-30 14:03
0
雪    币: 1907
活跃值: (5994)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
7
情形有点多,建议你自己IDA 去交叉引用FltObjectReference函数。你卸载的时候并不能保证他引用计数刚好是0。
2022-9-30 15:21
0
雪    币: 6054
活跃值: (12594)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
8
曹操abc 可能我表达的不够清晰,正常情形下直接 FltUnregisterFilter 没碰到过这个现象,也是能正常卸载。在什么情形下会出现_FLT_OBJECT对象引用计数不为 0。

FltUnregisterFilter本质是不能卸载其他驱动注册回调:

A minifilter driver can only call FltUnregisterFilter to unregister itself, not another minifilter driver.

引用清0是卸载回调的过程之一

最后于 2022-10-1 19:22 被一半人生编辑 ,原因:
2022-10-1 19:21
0
雪    币: 415
活跃值: (2633)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可以可以,大哥厉害
2022-10-10 15:23
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
ExReleaseRundownProtection对于某些模块无效,调用之后仍然不能清除引用
2024-10-16 10:42
0
游客
登录 | 注册 方可回帖
返回
//