TA的每日心情 | 奋斗 2023-9-22 14:51 |
|---|
签到天数: 341 天 [LV.8]以坛为家I
|
摘微过滤驱动回调的研究 游戏基址的最新消息可以到我们平台网站了解一下,也可以咨询客服人员进行详细的解答!
常用命令
下面是通过进行文件过滤驱动加载的常用命令。
1
2
DP
DP
问题
写过MFI驱动的都知道FUF用于注销回调。
但是MSDN中有这样一段话:
AFUF,
意思就是驱动应该自身去调用这个函数,而不是使用其他微过滤驱动去调用。
为此我写了一个驱动去验,发现再调用后驱动就在调用FUF后一去不复返了。
PCH
在对这个函数进行下断后,发现PCH在调用移除过滤器后确会调用FUF。
调试分析
上双机调试环境,把IDA拖入,启动,W和-联调。
1
2
3
F:\\
-
\_\\64\R\
!
!FUF
先追踪一去不复返的原因。
经过调试发现EWFRPR导致了函数的限等待。
找到了这个原因,让我们看看MSDN,根据R可知,需要通过调用来释放保护,这个函数才能返回。
再次调试,看看这个对象的引用计数是怎样的。
在调用R之后,我们断在函数FUF处:
1
2
3
4
5
6
7
8
9
1
:
B
0
!FUF:
880`
0
4884
,
1
:
=
0000000000000000
=
8
=
884
=
880
=
842
=
880
=
8800
=
8801
=
8800
8
=
8809
=
0000000000000000
=
88000
=
84
=
0000000000000000
=
00000000000000
=
00000000000000
=
880
=
0
=
00
=
=
0
=
0
=
03
=
0
=
00
!FUF:
880`
0
4884
,
首个参数即是_FLT_FILTER的指针
1
2
3
4
5
6
7
8
9
1
:!_FLT_FILTER@
+
0000
B:_FLT_OBJECT
+
00
F:
0
`
60
_FLTP_FRAME
+
N:_UNICODE_STRING
"DP"
+
DA:_UNICODE_STRING
"3451"
+
F:
2
(FLTFL_FILTERING_INITIATED)
+
00
DO:
0
`
60
_DRIVER_OBJECT
+
IL:_FLT_RESOURCE_LIST_HEAD
+
0
VE:()
+
000
VFL:_LIST_ENTRY[
000000000
`
00000000
-
000000000
`
00000000
]
+
000
FU:
80
`
60
DP!DPU
+
0
+
0
IS:
80
`
6000
DP!DPIS
+
0
+
00
IQT:
80
`
6
DP!DPIQT
+
0
+
ITS:
80
`
60
DP!DPITS
+
0
+
ITC:
80
`
600
DP!DPITC
+
0
+
SCLH:()
+
SC:[
6
]()
+
50
PVM:()
+
58
PVM:()
+
60
GFN:()
+
68
NNC:()
+
70
NNCE:()
+
78
NCC:()
+
80
KN:()
+
88
O:
0
`
6860
_FLT_OPERATION_REGISTRATION
+
90
ODU:()
+
98
AO:_FLT_MUTEX_LIST_HEAD
+
8
CL:_FLT_MUTEX_LIST_HEAD
+
38
PL:_FLT_MUTEX_LIST_HEAD
+
88
PL:_EX_PUSH_LOCK
接下来我们看看相关的计数
1
2
3
4
1
:??((!_FLT_FILTER
*
)(@))
-
BRR
_EX_RUNDOWN_REF
+
0000
C:
0
+
0000
P:
000000000
`
0000000
V
可以看到再我们卸载时这个C为0C。
在调用EWFRPR之前,我们再看一次计数
1
2
3
4
1
:??((!_FLT_FILTER
*
)(
84
))
-
BRR
_EX_RUNDOWN_REF
+
0000
C:
2
+
0000
P:
000000000
`
000000
V
可以看到此时的计数是2。
那么我们接下来测试PCH。
再调用移除过滤器后我们也成功断在了入口处。
1
2
3
4
5
6
7
8
9
1
:
B
0
!FUF:
880`
0
4884
,
0
:
=
8800
=
807
=
83500
=
83500
=
810
=
83500
=
8800
=
880
=
00000000000000
8
=
0000000000000000
9
=
0000000000000000
=
00000000000000
=
843553
=
835
=
8805550
=
0000000000000000
=
800060
=
0
=
00
=
=
0
=
0
=
03
=
0
=
0006
!FUF:
880`
0
4884
,
我们看一下引用计数,现在是0。
1
2
3
4
0
:??((!_FLT_FILTER
*
)(@))
-
BRR
_EX_RUNDOWN_REF
+
0000
C:
0
+
0000
P:
000000000
`
0000000
V
放过去,运行到调用EWFRPR之前,发现引用计数变为了0。
1
2
3
4
1
:??((!_FLT_FILTER
*
)(
3500
))
-
BRR
_EX_RUNDOWN_REF
+
0000
C:
0
+
0000
P:()
因此PCH肯定是调用了ERRP去释放运行时保护。
L’!
关键代码如下:
1
2
3
PEX_RUNDOWN_REFRR
=
(PEX_RUNDOWN_REF)((
*
)FL[]
+
);
ERRP(RR);
FUF(FL[]);
重新编译驱动,下断。
1
2
!FUF
!FUF
+
0
首次断下记录
1
2
3
4
5
6
7
0
:
=
0000000000000000
=
895
=
8890
=
000000000000000
=
8
=
8805694
=
8800
=
8805698
=
88056960
8
=
88989
=
0000000000000000
=
80
=
82
=
0000000000000000
=
00000000000000
=
00000000000000
=
8
第二次断下查看计数,O!效果和PCH一样了。
1
2
3
4
1
:??((!_FLT_FILTER
*
)(
890
))
-
BRR
_EX_RUNDOWN_REF
+
0000
C:
0
+
0000
P:()
然后就成功移除掉了。 |
|