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

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

2022-8-22 14:52
5720

希望实现的功能:特定文件(如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中,如何获取当前正在操作的文件路径和操作这个文件的进程路径?

 

请各位大佬指教~~ 谢谢


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

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

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

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

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

ZwQueryInformationProcess   参数 ProcessImageFileName

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

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

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


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


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