首页
社区
课程
招聘
[已解决]驱动内核态怎么调用应用层的函数?
2022-3-31 22:09 5736

[已解决]驱动内核态怎么调用应用层的函数?

2022-3-31 22:09
5736

目标是实现一个简单的进程筛选功能,比如通过校验exe文件的签名、MD5判断是否可以启动这个exe。

 

两种实现方案:
1、应用层挂钩拦截CreateProcess,涉及把dll注入所有进程里面,稳定性堪忧,所以选了下面这个方案。

 

2、驱动实现,内核层在PsSetCreateProcessNotifyRoutineEx中可以获取到正在被加载的filepath,并且可以控制进程是否允许加载,实现很简单。主要问题出在校验规则上,因为这个校验规则很复杂,不是简单对比一下文件名、文件路径,而是涉及exe的证书签名校验、MD5校验……等等复杂规则。

 

如果在应用层校验一个exe文件的签名、MD5非常简单,有现成的dll可以调用,但是在内核层要做文件的复杂校验规则想想就觉得可怕,所以想到在Ring0截获exe的filepath后送到Ring3去做Validate校验,然后在Ring3返回一个校验是否通过的Flag给Ring0,但是这样又在同步机制上遇到一些问题。

 

后来又查了资料发现有一些通过KeUserModeCallBack实现的Ring0 Call Ring3的方案,但是实现非常麻烦不说,还有很多ASM硬编码和shellcode,兼容性、稳定性堪忧。

 

不知道各位大神们有没有什么好的建议呀?遇到这种需要复杂Validate规则的情况怎么处理?


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

最后于 2022-4-17 13:06 被碧水秋沙编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (10)
雪    币: 225
活跃值: (1487)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_0xC05StackOver 2022-3-31 22:40
2
0
你这个还是用r0 r3通讯做吧 直接call太麻烦了
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
碧水秋沙 2022-3-31 23:17
3
0
wx_0xC05StackOver 你这个还是用r0 r3通讯做吧 直接call太麻烦了

我也想啊。。。搞了好几天了,同步机制上遇到一些问题没法解决。大概情况是DeviceIoContorl的控制码处理流程(IOCTL_READ、IOCTL_WRITE)和PsSetCreateProcessNotifyRoutineEx的分派函数事件同步机制有冲突。


PsSetCreateProcessNotifyRoutineEx的分派函数里面只要一调用KeWaiForSingleObject就把整个驱动程序都挂住了,即使在IOCTL_WRITE里面KeSetEnvet也无效。


但是反过来在IOCTL_READ中KeWaiForSingleObject,在PsSetCreateProcessNotifyRoutineEx分派函数中KeSetEvent倒没问题可以跑通,所以现在只做到了可以在R0把进程路径传回给R3,但是R3的Validate结果不能传回给R0,因为此时R0的PsSetCreateProcessNotifyRoutineEx分派函数正在调用KeWaitForSingleObject等待接收R3返回的校验结果,把整个驱动都给挂住假死了,导致ICTL_WRITE里面的KeSetEvent信号放行PsSetCreateProcessNotifyRoutineEx无法执行,进而一直陷入僵死状态。。。大概就是这么个情况,大佬们有啥意见不?

最后于 2022-3-31 23:49 被碧水秋沙编辑 ,原因:
雪    币: 39
活跃值: (4152)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
ookkaa 2022-4-1 00:03
4
0
minifilter啊,自带通讯,内核层发信息给用户层,用户层来写规则,传结果给驱动就行了,还自带同步机制
雪    币: 12837
活跃值: (8993)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2022-4-1 06:51
5
0
FltSendMessage
雪    币: 50
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_大可爱 2022-4-1 08:14
6
0
hzqst FltSendMessage
大表哥,IDAPython7.7,咋装第三方库啊
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
碧水秋沙 2022-4-1 09:00
7
0
ookkaa minifilter啊,自带通讯,内核层发信息给用户层,用户层来写规则,传结果给驱动就行了,还自带同步机制
666,谢大佬指点,还没搞过minifilter,我来研究一下,有问题再来请教。
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
碧水秋沙 2022-4-1 09:01
8
0
hzqst FltSendMessage
还是这里的大佬多~百度了三天没有解决方案,大佬们两三句话就指明了方向了
雪    币: 2378
活跃值: (9195)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
TkBinary 5 2022-4-2 14:49
9
0
参考minifilter的例子 scanner里面的user就是通讯代码。直接拷贝下来用就行。
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
碧水秋沙 2022-4-2 19:25
10
0
666, 又学到了,马上从github上把msdn实例代码爬下来了,有好多例子可以研究了
雪    币: 50
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_大可爱 2022-4-3 14:29
11
0
MmGetSystemRoutineAddress 
游客
登录 | 注册 方可回帖
返回