首页
社区
课程
招聘
[原创]摘微过滤驱动回调的研究-续
发表于: 2022-9-30 12:21 10119

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

2022-9-30 12:21
10119

自上回发现对象引用计数后,再次在Win10上进行测试,发现大概率又卡死在ExWaitForRundownProtectionRelease函数。因为只有引用计数在调用这个函数之前不为0,就会进入等待。那么PCHunter是怎么处理引用计数的呢?Why not reverse it?

首先我们通过WinArk设置一个镜像回调拦截驱动加载。这里感谢砍酱的提醒,如果PCHunter已经启动过了,那么pchunter关闭的时候不会卸载驱动。所以需要手动卸载后再拦截。

拦截到驱动后

拖入IDA,上ret-sync。

我们使用一个DelProtect.sys,作为测试驱动,然后依旧选择移除过滤器,函数断下

此时我们通过下面的指令查看当前线程函数入口

可以看到函数地址为0xfffff80477666a18

在IDA中转到

通过交叉引用,可知此为r0接口处理处

再往上走就是其他一堆功能函数了

继续分析,我们对这个功能函数下断,从头跟踪一次,因为FltUnregisterFilter 已经走到很后面了。

我们使用命令查看返回地址之前的反汇编

由此rax指向的函数就是FltUnregisterFilter ,线程函数的context传入的是PFLT_FILTER

继续分析这里面还有一个rbx指向的函数指针。

综上这个线程函数分析完毕,姚老师不是在线程函数里完成_FLT_OBJECT的对象引用计数递减的。

继续进行函数调用上层分析,根据内核编程基础,可直接推测在创建线程后,对_ETHREAD增加引用计数,然后进行等待,等待完成后解引用对象,最后关闭线程句柄。

由此分析完毕,这个函数也不是我们想找的。

继续往上分析,也无大发现。

静态分析无果,Windbg动态调试。

我们跟踪一下哪里调用进来的这个函数。下断返回地址。

然后就断下来了。

F10 一步步单步返回。

调试过程中出现了一些异常,为了避免跑飞啥的,下个ret处的断点。

最后我们回溯到了DriverObject的0xE函数里。

总感觉真的少了点什么步骤,因此我们在这里下个断点,放过去,然后加载卸载其他文件过滤驱动。从头来一次。

再次选中卸载一个微软驱动的微过滤器,后我们断在了DispatchHandler里。

一步步的调试,并为IDA添加注释。

这里我们不再断在线程函数里。

g放行,第二次断下到call ebx, 看了一下再初始化内存为0,然后没有传递相关微过滤驱动相关的东西,猜想应该是摘掉后遍历一次。直接放过去。

我们试试手动刷新会调用到哪里进行验证,确实如此。

第二次也断在同样的地方。由此逻辑就是刷新会调用两个功能函数。而移除后进行了刷新的调用。因此移除的功能只涉及一次函数调用。

白干了!PCHunter不卡的原因是他启用的系统线程去处理的?因为经过逆向分析,Windows 10 确实啥也没做。他不卡是因为创建了系统线程去跑,能不能摘掉就听天由命了。不信看官自己试试,他也摘不掉。

证明方法:通过遍历系统进程的线程,然后搜函数地址为0xFFFFF80477666A18的线程

综上所述,解决思路就是用系统线程去跑,如果没摘掉再跑一次,等到对象引用计数降为为0然后就摘掉了

 
 
 
 
.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
0: kd> g
Breakpoint 0 hit
FLTMGR!FltUnregisterFilter:
fffff804`73eed6b0 48895c2418      mov     qword ptr [rsp+18h],rbx
0: kd> g
Breakpoint 0 hit
FLTMGR!FltUnregisterFilter:
fffff804`73eed6b0 48895c2418      mov     qword ptr [rsp+18h],rbx
0: kd> !thread @$thread
THREAD ffffcf8f7fc74080  Cid 0004.03c4  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 0
Not impersonating
DeviceMap                 ffffa88a30e14c00
Owning Process            ffffcf8f7bc8d300       Image:         System
Attached Process          N/A            Image:         N/A
Wait Start TickCount      0              Ticks: 76618 (0:00:19:57.156)
Context Switch Count      1              IdealProcessor: 1            
UserTime                  00:00:00.000
KernelTime                00:00:00.000
Win32 Start Address PCHunter64as (0xfffff80477666a18)
Stack Init ffffbb8c5239dc90 Current ffffbb8c5239dc20
Base ffffbb8c5239e000 Limit ffffbb8c52398000 Call 0000000000000000
Priority 8 BasePriority 8 PriorityDecrement 0 IoPriority 2 PagePriority 5
Child-SP          RetAddr               : Args to Child                                                           : Call Site
ffffbb8c`5239dbd8 fffff804`77666a4b     : 00000000`00000000 ffffcf8f`7bc8d300 ffffcf8f`7eb43180 00000000`00000192 : FLTMGR!FltUnregisterFilter
ffffbb8c`5239dbe0 fffff804`711c3d65     : ffffcf8f`7fc74080 fffff804`77666a18 ffffcf8f`805a4bc0 00000000`00000001 : PCHunter64as+0x16a4b
ffffbb8c`5239dc10 fffff804`71268a8c     : fffff804`6f89b180 ffffcf8f`7fc74080 fffff804`711c3d10 ffffcf8f`7cd85870 : nt!PspSystemThreadStartup+0x55
ffffbb8c`5239dc60 00000000`00000000     : ffffbb8c`5239e000 ffffbb8c`52398000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x1c
0: kd> !thread @$thread
THREAD ffffcf8f7fc74080  Cid 0004.03c4  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 0
Not impersonating
DeviceMap                 ffffa88a30e14c00
Owning Process            ffffcf8f7bc8d300       Image:         System
Attached Process          N/A            Image:         N/A
Wait Start TickCount      0              Ticks: 76618 (0:00:19:57.156)
Context Switch Count      1              IdealProcessor: 1            
UserTime                  00:00:00.000
KernelTime                00:00:00.000
Win32 Start Address PCHunter64as (0xfffff80477666a18)
Stack Init ffffbb8c5239dc90 Current ffffbb8c5239dc20
Base ffffbb8c5239e000 Limit ffffbb8c52398000 Call 0000000000000000
Priority 8 BasePriority 8 PriorityDecrement 0 IoPriority 2 PagePriority 5
Child-SP          RetAddr               : Args to Child                                                           : Call Site
ffffbb8c`5239dbd8 fffff804`77666a4b     : 00000000`00000000 ffffcf8f`7bc8d300 ffffcf8f`7eb43180 00000000`00000192 : FLTMGR!FltUnregisterFilter
ffffbb8c`5239dbe0 fffff804`711c3d65     : ffffcf8f`7fc74080 fffff804`77666a18 ffffcf8f`805a4bc0 00000000`00000001 : PCHunter64as+0x16a4b
ffffbb8c`5239dc10 fffff804`71268a8c     : fffff804`6f89b180 ffffcf8f`7fc74080 fffff804`711c3d10 ffffcf8f`7cd85870 : nt!PspSystemThreadStartup+0x55
ffffbb8c`5239dc60 00000000`00000000     : ffffbb8c`5239e000 ffffbb8c`52398000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x1c
 
 
 
 
 
 
 
 
0: kd> ub PCHunter64as+0x16a4b
PCHunter64as+0x16a34:
fffff804`77666a34 488bd8          mov     rbx,rax
fffff804`77666a37 e89cf60000      call    PCHunter64as+0x260d8 (fffff804`776760d8)
fffff804`77666a3c 4885ff          test    rdi,rdi
fffff804`77666a3f 740a            je      PCHunter64as+0x16a4b (fffff804`77666a4b)
fffff804`77666a41 4885c0          test    rax,rax
fffff804`77666a44 7405            je      PCHunter64as+0x16a4b (fffff804`77666a4b)
fffff804`77666a46 488bcf          mov     rcx,rdi
fffff804`77666a49 ffd0            call    rax
0: kd> ub PCHunter64as+0x16a4b

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

收藏
免费 4
支持
分享
最新回复 (4)
雪    币: 6
活跃值: (3290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不是有 2003源码吗? 结合以前的,调试下win10的应该更清楚
2022-9-30 18:07
0
雪    币: 1907
活跃值: (5994)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
3
咖啡_741298 不是有 2003源码吗? 结合以前的,调试下win10的应该更清楚

FltUnregisterFilter你亲自搜过吗?

2022-10-1 09:18
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
膜拜大神
2022-10-1 12:23
0
雪    币: 201
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
拦截驱动的工具自己写的吗?能不能发个
2022-11-13 15:23
0
游客
登录 | 注册 方可回帖
返回
//