首页
社区
课程
招聘
[求助]minifilter怎么获取当前正在读写的文件和对应的进程信息?
发表于: 2022-8-22 14:52 7078

[求助]minifilter怎么获取当前正在读写的文件和对应的进程信息?

2022-8-22 14:52
7078

希望实现的功能:特定文件(如c:\test.txt)只能特定进程(如d:\xxx.exe)才能打开读写,其他任何进程无法读写这个文件,进而达到文件保护功能。

 

实现:
用minifilter注册了IRP_MJ_CREATE的Pre操作函数:

1
FLT_PREOP_CALLBACK_STATUS PreCreateFile(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID* CompletionContext)

问题:
在PreCreateFile中,如何获取当前正在操作的文件路径和操作这个文件的进程路径?

 

请各位大佬指教~~ 谢谢


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

最后于 2022-8-22 15:22 被碧水秋沙编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
2
我也借楼问问,
怎么在IRP_MJ_CREATE的Pre函数里获取到当前操作的对象是个”文件“还是”文件夹“?
2022-8-22 15:28
0
雪    币: 2325
活跃值: (2304)
能力值: ( LV6,RANK:89 )
在线值:
发帖
回帖
粉丝
3
PEPROCESS objCurProcess = IoThreadToProcess( Data->Thread );
2022-8-22 15:54
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
LexSafe PEPROCESS objCurProcess = IoThreadToProcess( Data->Thread );
测试好用,感谢大佬指点~~
2022-8-23 11:02
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Lixinist 我也借楼问问, 怎么在IRP_MJ_CREATE的Pre函数里获取到当前操作的对象是个”文件“还是”文件夹“?
FltObjects->FileObject->FileName 拿到文件对象后,可以判断最后是不是" \ ”结尾
2022-8-23 11:04
0
雪    币: 407
活跃值: (1816)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Lixinist 我也借楼问问, 怎么在IRP_MJ_CREATE的Pre函数里获取到当前操作的对象是个”文件“还是”文件夹“?
FltIsDirectory
2022-8-23 12:25
0
雪    币: 210
活跃值: (1707)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

PFLT_CALLBACK_DATA  中不是有processobject么 用 PsGetProcessId 就能获取PID了啊 用PsGetProcessImageFileName就能获取process的全路径了 

FltGetFileNameInformation 可以拿到文件信息,这些东西google能查到 自己搜索下吧
最后于 2022-8-23 16:00 被wx_0xC05StackOver编辑 ,原因:
2022-8-23 15:58
0
雪    币: 6895
活跃值: (3484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
FltGetFileNameInformation  FltGetRequestorProcess这两个应该更合理一些
2022-8-23 16:01
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
wx_0xC05StackOver PFLT_CALLBACK_DATA  中不是有processobject么 用 PsGetProcessId&nbsp ...
PsGetProcessImageFileName得到的只有进程的文件名,不包括前面的路径部分,需求是获取进程全路径。
2022-8-23 16:18
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
MSGG05 FltGetFileNameInformation FltGetRequestorProcess这两个应该更合理一些
获取当前文件全路径已经实现了:IoVolumeDeviceToDosName获取卷标,FltObjects->FileObject->FileName获取路径,然后拼接在一起就是文件全路径。

获取进程全路径暂时还没搞定,PEPROCESS 能直接得到的只有进程文件名或者PID,网上有些方案是直接读PEB的偏移地址获取全路径,代码比较简洁但是是硬编码的,兼容性不太好。其他的方案都是长篇大论啰里啰唆,难道就没有一个简单点方法获取进程全路径吗?
2022-8-23 16:34
0
雪    币: 6895
活跃值: (3484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11

ZwQueryInformationProcess   参数 ProcessImageFileName

最后于 2022-8-23 16:44 被MSGG05编辑 ,原因:
2022-8-23 16:44
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
MSGG05 ZwQueryInformationProcess   参数 ProcessImageFileName
ZwQueryInformationProcess    —— 这个是在应用层调用的吧?现在是在驱动层,怎么调用ZwQueryInformationProcess呢?
2022-8-23 20:59
0
雪    币: 6895
活跃值: (3484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
碧水秋沙 ZwQueryInformationProcess —— 这个是在应用层调用的吧?现在是在驱动层,怎么调用ZwQueryInformationProcess呢?
驱动可以用的,用MmGetSystemRoutineAddress获取函数地址就可以调用了
2022-8-23 21:07
1
雪    币: 6895
活跃值: (3484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
碧水秋沙 ZwQueryInformationProcess —— 这个是在应用层调用的吧?现在是在驱动层,怎么调用ZwQueryInformationProcess呢?
 https://oomake.com/question/857399 可以参照这个下面回复中的代码
2022-8-23 21:13
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
MSGG05 https://oomake.com/question/857399 可以参照这个下面回复中的代码
谢谢大佬,经过一番努力已经抓到了进程名路径了,但是ZwQueryInformationProcess查出来的路径是设备名,\Device\HarddiskVolume3\Windows\explorer.exe这种形式,怎么把它转成盘符呢?网上的方法都是遍历C盘到Z盘,把DOS路径转成设备路径然后逐一对比,这方法太傻了吧,而且兼容性堪忧,如果盘符分区大于26个可能会有异常,有没有啥API函数可以一步到位或者尽可能简洁点把设备路径转换成DOS路径?
2022-8-23 22:23
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
16
碧水秋沙 谢谢大佬,经过一番努力已经抓到了进程名路径了,但是ZwQueryInformationProcess查出来的路径是设备名,\Device\HarddiskVolume3\Windows\explore ...
PsReferenceProcessFilePointer+IoQueryFileDosDeviceName
没PsReferenceProcessFilePointer的系统自己想办法
2022-8-23 22:49
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
hzqst PsReferenceProcessFilePointer+IoQueryFileDosDeviceName 没PsReferenceProcessFilePointer的系统自己想办法
谢谢大牛,这个之前在CSDN上看到了,但是调试代码一调用PsReferenceProcessFilePointer就蓝屏,弄了半天不知道哪里有问题,所以后来放弃了。

https://my.oschina.net/simpower91/blog/4263121
copy了几个又臭又长的函数搞定了,但是实在看不顺眼啊。。。
2022-8-23 23:09
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
18
Thead FltIsDirectory
这个函数我记得在Pre里是用不了的,只能在Post函数里用
2022-8-25 14:48
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
19
碧水秋沙 FltObjects->FileObject->FileName 拿到文件对象后,可以判断最后是不是" \ ”结尾
这个方法我记得在某些情况下不灵。有可能文件对象末尾是“文件夹名“而不是” \ ”
2022-8-25 14:50
0
雪    币: 407
活跃值: (1816)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
Lixinist 这个函数我记得在Pre里是用不了的,只能在Post函数里用
我查了一下文档,确实是不行的,不过调用fltcreatefile打开文件再查一次文件属性,就可以了
2022-8-27 23:20
1
雪    币: 1825
活跃值: (5354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21

没用.从N年前疼熏就用流氓驱动给你反复无限循环挂钩子, 单纯百姓信它鬼话说只是保护自己进程, 其实更重要的是想上传啥就上传啥, 你只要钩子覆盖不过它, 就别想知道它干了什么肮脏事


PS:忘了最反智和愚民的一点, 那个肮脏驱动开机强制自启, 即使你不用它软件它也操蛋地开机自启, 全系统底层挂红色钩子,  愚木脑袋也能看出它不可能只是为了保护软件


最后于 2022-8-28 12:18 被PEDIY编辑 ,原因:
2022-8-28 12:05
0
游客
登录 | 注册 方可回帖
返回
//