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

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

2022-3-31 22:09
6566

目标是实现一个简单的进程筛选功能,比如通过校验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规则的情况怎么处理?


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2022-4-17 13:06 被碧水秋沙编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 210
活跃值: (1707)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你这个还是用r0 r3通讯做吧 直接call太麻烦了
2022-3-31 22:40
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
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 被碧水秋沙编辑 ,原因:
2022-3-31 23:17
0
雪    币: 246
活跃值: (4427)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
4
minifilter啊,自带通讯,内核层发信息给用户层,用户层来写规则,传结果给驱动就行了,还自带同步机制
2022-4-1 00:03
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
FltSendMessage
2022-4-1 06:51
0
雪    币: 50
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
hzqst FltSendMessage
大表哥,IDAPython7.7,咋装第三方库啊
2022-4-1 08:14
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
ookkaa minifilter啊,自带通讯,内核层发信息给用户层,用户层来写规则,传结果给驱动就行了,还自带同步机制
666,谢大佬指点,还没搞过minifilter,我来研究一下,有问题再来请教。
2022-4-1 09:00
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
hzqst FltSendMessage
还是这里的大佬多~百度了三天没有解决方案,大佬们两三句话就指明了方向了
2022-4-1 09:01
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
9
参考minifilter的例子 scanner里面的user就是通讯代码。直接拷贝下来用就行。
2022-4-2 14:49
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
666, 又学到了,马上从github上把msdn实例代码爬下来了,有好多例子可以研究了
2022-4-2 19:25
0
雪    币: 50
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
MmGetSystemRoutineAddress 
2022-4-3 14:29
0
游客
登录 | 注册 方可回帖
返回
//