小弟最近在研究 minifilter 文件过滤驱动开发 有个疑问 望各位给予解惑 谢谢!!
如果可以能加QQ便于交流 更加感谢 谢谢!
问题如下:
``````````````````````````````````````````````````````````````````````````````````````````````
我在驱动中过滤所有涉及到IRP_MJ_CREATE 的文件操作 但出现这样状况:
我的期望预见的是:
例 我打开一个 任意文件(比如 test.txt)我只要截取test.txt 这个有IRP_MJ_CREATE 的操作文件
```````````````````````````````````````````````````````````````````````````````````````````````
但是我获取的是 包含了很多的 库文件 exe 等等文件 (100+ 多个有IRP_MJ_CREATE 操作的文件)
这个我到明白 是在进行打开 test.txt 文件时 系统内部进行的加载活动 (我想杀毒 就是如此吧)
``````````````````````````````````````````````````````````````````````````````````````````````
各位大虾 ,有没有什么解决办法或建议
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理(就是在100+ 或更多文件中获取我的目标文件 test.txt )!!!
44 个解决方案
#1
根据文件对象FileObject拿到文件的路径,然后比较,搜下 ObQueryNameString
#2
en 我是想实现:
就是我在计算机上做文件操作 我并不知道我操作了什么文件
在驱动中 获取我在计算机直接操作的文件名
恩 这个 ObQueryNameString 查了下 一头雾水
liuyu60305002 能再详细些么 谢谢...
#3
PFLT_FILE_NAME_INFORMATION pfNameInfo;
status = FltGetFileNameInformation(Data,
FLT_FILE_NAME_OPENED|FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
&pfNameInfo) ;
if (!NT_SUCCESS(status))
处理代码 ;
FltParseFileNameInformation(pfNameInfo);
if (0 == pfNameInfo->Name.Length)
处理代码;
然后看看PFLT_FILE_NAME_INFORMATION定义
另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实
status = FltGetFileNameInformation(Data,
FLT_FILE_NAME_OPENED|FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
&pfNameInfo) ;
if (!NT_SUCCESS(status))
处理代码 ;
FltParseFileNameInformation(pfNameInfo);
if (0 == pfNameInfo->Name.Length)
处理代码;
然后看看PFLT_FILE_NAME_INFORMATION定义
另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实
#4
Delelebug
你好.
你这个事获取文件名吧
这个我已经做到了 就是我只打开一个文件 但在debugview 中看到有N多文件
我这个目标 可能有点....
但是没办法 还得想办法解决啊
还是谢谢你..
你好.
你这个事获取文件名吧
这个我已经做到了 就是我只打开一个文件 但在debugview 中看到有N多文件
我这个目标 可能有点....
但是没办法 还得想办法解决啊
还是谢谢你..
#5
是有n多文件,比如你打开个txt,用记事本,首先要加载记事本的程序,记事本的程序可能又要加载一堆东西,记事本还简单些,碰到office,pdf之类的,麻烦死
只要打开文件都需要从磁盘上读取,要读取首先要创建文件对象,(这里认为第一次读取,忽略内存缓冲)
所以你那个想法不太好,需要研究每种进程的特性
只要打开文件都需要从磁盘上读取,要读取首先要创建文件对象,(这里认为第一次读取,忽略内存缓冲)
所以你那个想法不太好,需要研究每种进程的特性
#6
我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握
其实我就是想做个 :
你在电脑上操作文件 然后在驱动中获取信息写成日志
但现在是 获取一大堆 加载库 exe 啊 什么的完全没达到目标...
#7
放弃你的想法吧,不太可能
我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握
我随便写个类似记事本的程序,用来打开文本文件,你能处理吗?其他工具更新你怎么处理?跟着更新?岂不是要累死?
我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握
我随便写个类似记事本的程序,用来打开文本文件,你能处理吗?其他工具更新你怎么处理?跟着更新?岂不是要累死?
#8
记得以前看到过个推荐的帖子
http://topic.csdn.net/u/20110228/21/ef5d250c-4532-456e-9656-c71fc21a3e5a.html
我也跟风回复过,呵呵,
希望对你有帮助,也许看完了,你就会放弃现在的想法了
http://topic.csdn.net/u/20110228/21/ef5d250c-4532-456e-9656-c71fc21a3e5a.html
我也跟风回复过,呵呵,
希望对你有帮助,也许看完了,你就会放弃现在的想法了
#9
你到底要做什么,判断文件名有没有test.txt不就行了
#10
列宁大哥,楼主的意思是获取任意一个打开的文件,名字不固定,
比如打开个test1.txt, test2.doc,然后把这些文件名显示出来
要把应用程序加载的dll之类的,和配置文件,字体文件等等的都剔除掉
比如打开个test1.txt, test2.doc,然后把这些文件名显示出来
要把应用程序加载的dll之类的,和配置文件,字体文件等等的都剔除掉
#11
加载的dll之类的,能区分出来,但是配置文件,字体文件,模板文件怎么办呢?
我个人觉得这个想法不太现实,
因为打开一个文件的时候,有很多有关的文件也同时打开了,又区分不出来。。。
我个人觉得这个想法不太现实,
因为打开一个文件的时候,有很多有关的文件也同时打开了,又区分不出来。。。
#12
仅限于资源管理器的?
#13
资源管理器的?
什么意思
什么意思
#14
怎样打开一个文件才属于它要记录的
#15
这不好判断吧,如果手动打开“ 应用程序加载配置文件”那咋办???
#16
某个目录下有个test.pdf文件,然后打开这个文件,则记录这个文件,提示用户test.pdf文件被打开,呵呵,
这个就是楼主的意思了
这不好判断吧,如果手动打开“应用程序加载配置文件”那咋办???
这个就得问楼主了,看楼主怎么处理了,呵呵
这个就是楼主的意思了
这不好判断吧,如果手动打开“应用程序加载配置文件”那咋办???
这个就得问楼主了,看楼主怎么处理了,呵呵
#17
我晕,怎么搞的我像楼主似的。。。
#18
实际上楼主是你的马甲
#19
这才是重点啊,lz想好没???
#20
。。。
你就这点能耐?
瞎猜可不行
#21
当然我也有问题,不过我很难相信你能解决,不过你可以试试
获取system.exe创建文件的irp,这时候往下层发送irp 来create该文件的时候,会无限卡死,原因不明
首先说一下,不要去网上搜了,我搜遍了
网络os文件操作好像都是由system完成的,可以用这点来模拟
获取system.exe创建文件的irp,这时候往下层发送irp 来create该文件的时候,会无限卡死,原因不明
首先说一下,不要去网上搜了,我搜遍了
网络os文件操作好像都是由system完成的,可以用这点来模拟
#22
你是如何获取的,单单是system?
#23
恩,只有system,诺顿和国内杀软不兼容也类似。
获取就是create的irp下发前getcurrentpid
获取就是create的irp下发前getcurrentpid
#24
当然,杀软不兼容不仅仅这一点
#25
你是附加设备还是修改函数表
如果是这样你加载过滤的驱动程序后很快就卡死
如果是这样你加载过滤的驱动程序后很快就卡死
#26
谢谢 各位大侠的 建议和讨论...
虽然没解决(也许真的很难)但还是很有收获的...
这个贴在 放一放 没准那位大侠一下有思路了呢 \(^o^)/~
我也在查资料 但收获不大啊...
尤其感谢 Lactoferrin Delelebug 两位 O(∩_∩)O哈哈~ ...
你们交流 我学习
虽然没解决(也许真的很难)但还是很有收获的...
这个贴在 放一放 没准那位大侠一下有思路了呢 \(^o^)/~
我也在查资料 但收获不大啊...
尤其感谢 Lactoferrin Delelebug 两位 O(∩_∩)O哈哈~ ...
你们交流 我学习
#27
路过,围观。。。。。。。。。。。。
#28
用资源管理器打开文件时会查注册表找打开方式,你可以从这里下手,不过还是会漏掉一些
#29
不要拿别人当3岁小孩子,
你是如何获取的,单单是system? 这一句我本就不想回复,
我前面已经描述的很清楚的,包括重现方式
#30
你这言语态度不友好,不像讨论问题的,我并无恶意
#31
这句友好?你可以问问楼主我是否认识他
#32
仅是一句玩笑话,不必当真
#33
原来是这个导致不和谐,就当我放屁
#34
你这么说,我倒蛮不好意思的,当我上面也是放屁好了
#35
.....
晕了 两位
和谐 和谐 社会
O(∩_∩)O哈哈~ 咱这是学术研究 争执难免
其实 大家都是无恶意的 无心之举
这事怪我没早现身 昨天太忙了 sorry
晕了 两位
和谐 和谐 社会
O(∩_∩)O哈哈~ 咱这是学术研究 争执难免
其实 大家都是无恶意的 无心之举
这事怪我没早现身 昨天太忙了 sorry
#36
这贴结了重开吧,要不他俩不好意思在讨论了~~~
#37
最后的思路了 通过资源管理器了
╮(╯▽╰)╭ 只能试试看了...
╮(╯▽╰)╭ 只能试试看了...
#38
底层这里 看来时没办法了
╮(╯▽╰)╭...
╮(╯▽╰)╭...
#39
你的需求不就是获取文件名进行比较?
很奇怪啊 ?
在MINIFILTER下 进行路径名比较
是你需要监控的进行处理
不进行监控的返回COMPLETE 或者SUCCESS_NO_CALLBACK .
而比较的路径名并是由驱动固定死 由用户层通讯端传入
这样你想监控1.txt就监控1.txt 想监控2.doc就监控2.doc
区分不出来在想象别的办法
有名字比较为什么不能判断出来?
而且在别的回复轻易断定别人的想法不可行
这个是否太过武断了
因为我们本身的知识储备不足
一句话扼杀的可能是一个正确的方向
“
另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实”
这个完全可行 去别处自己想要的最终文件 其余全部放行 完全可以 毕竟你写的是过滤驱动
不是文件驱动FAT32 NTFS,放行让不关心的文件按原来的流程走 这个是很正常的
日志不是你打印的么 比较文件名 你感兴趣的才打印 感兴趣的放行即可
所有文件进行操作 无论是写入读取还是删除 重命名
都要经过CREATE 只要在MINIFILTER CREATE中进行路径比对 判断出来 完全可以。
手动打开 这个一样是经过文件系统的
#40
这位说的是SFILTER做法 一样是比较路径名 方法
很简单也很靠谱
之后的回复 都有点不知所云。。。。
#41
在create里判断文件是否是操作的那个文件,在底层不应该有这种想法。据我所知,在底层只能通过通信,才能知道应用层操作的文件名。
在create里可以通过比较文件名,判断一些标志位来滤掉大部分文件,但是具体哪个文件,无法判断。
其实你可以换个角度去考虑,比如处理内存,只要能实现你的功能就行。
在create里可以通过比较文件名,判断一些标志位来滤掉大部分文件,但是具体哪个文件,无法判断。
其实你可以换个角度去考虑,比如处理内存,只要能实现你的功能就行。
#42
#43
加个文件名过滤
#44
直接获取打开文件的文件名就可以了啊 有个file->filename可以得到文件打开的文件名
遍历这个文件名 用一个指针指向L"."就可以了啊 取得这个指针就行了啊
遍历这个文件名 用一个指针指向L"."就可以了啊 取得这个指针就行了啊
#1
根据文件对象FileObject拿到文件的路径,然后比较,搜下 ObQueryNameString
#2
en 我是想实现:
就是我在计算机上做文件操作 我并不知道我操作了什么文件
在驱动中 获取我在计算机直接操作的文件名
恩 这个 ObQueryNameString 查了下 一头雾水
liuyu60305002 能再详细些么 谢谢...
#3
PFLT_FILE_NAME_INFORMATION pfNameInfo;
status = FltGetFileNameInformation(Data,
FLT_FILE_NAME_OPENED|FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
&pfNameInfo) ;
if (!NT_SUCCESS(status))
处理代码 ;
FltParseFileNameInformation(pfNameInfo);
if (0 == pfNameInfo->Name.Length)
处理代码;
然后看看PFLT_FILE_NAME_INFORMATION定义
另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实
status = FltGetFileNameInformation(Data,
FLT_FILE_NAME_OPENED|FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
&pfNameInfo) ;
if (!NT_SUCCESS(status))
处理代码 ;
FltParseFileNameInformation(pfNameInfo);
if (0 == pfNameInfo->Name.Length)
处理代码;
然后看看PFLT_FILE_NAME_INFORMATION定义
另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实
#4
Delelebug
你好.
你这个事获取文件名吧
这个我已经做到了 就是我只打开一个文件 但在debugview 中看到有N多文件
我这个目标 可能有点....
但是没办法 还得想办法解决啊
还是谢谢你..
你好.
你这个事获取文件名吧
这个我已经做到了 就是我只打开一个文件 但在debugview 中看到有N多文件
我这个目标 可能有点....
但是没办法 还得想办法解决啊
还是谢谢你..
#5
是有n多文件,比如你打开个txt,用记事本,首先要加载记事本的程序,记事本的程序可能又要加载一堆东西,记事本还简单些,碰到office,pdf之类的,麻烦死
只要打开文件都需要从磁盘上读取,要读取首先要创建文件对象,(这里认为第一次读取,忽略内存缓冲)
所以你那个想法不太好,需要研究每种进程的特性
只要打开文件都需要从磁盘上读取,要读取首先要创建文件对象,(这里认为第一次读取,忽略内存缓冲)
所以你那个想法不太好,需要研究每种进程的特性
#6
我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握
其实我就是想做个 :
你在电脑上操作文件 然后在驱动中获取信息写成日志
但现在是 获取一大堆 加载库 exe 啊 什么的完全没达到目标...
#7
放弃你的想法吧,不太可能
我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握
我随便写个类似记事本的程序,用来打开文本文件,你能处理吗?其他工具更新你怎么处理?跟着更新?岂不是要累死?
我也考虑到进程 但一觉得一定很麻烦 二觉得稳定性我没法把握
我随便写个类似记事本的程序,用来打开文本文件,你能处理吗?其他工具更新你怎么处理?跟着更新?岂不是要累死?
#8
记得以前看到过个推荐的帖子
http://topic.csdn.net/u/20110228/21/ef5d250c-4532-456e-9656-c71fc21a3e5a.html
我也跟风回复过,呵呵,
希望对你有帮助,也许看完了,你就会放弃现在的想法了
http://topic.csdn.net/u/20110228/21/ef5d250c-4532-456e-9656-c71fc21a3e5a.html
我也跟风回复过,呵呵,
希望对你有帮助,也许看完了,你就会放弃现在的想法了
#9
你到底要做什么,判断文件名有没有test.txt不就行了
#10
列宁大哥,楼主的意思是获取任意一个打开的文件,名字不固定,
比如打开个test1.txt, test2.doc,然后把这些文件名显示出来
要把应用程序加载的dll之类的,和配置文件,字体文件等等的都剔除掉
比如打开个test1.txt, test2.doc,然后把这些文件名显示出来
要把应用程序加载的dll之类的,和配置文件,字体文件等等的都剔除掉
#11
加载的dll之类的,能区分出来,但是配置文件,字体文件,模板文件怎么办呢?
我个人觉得这个想法不太现实,
因为打开一个文件的时候,有很多有关的文件也同时打开了,又区分不出来。。。
我个人觉得这个想法不太现实,
因为打开一个文件的时候,有很多有关的文件也同时打开了,又区分不出来。。。
#12
仅限于资源管理器的?
#13
资源管理器的?
什么意思
什么意思
#14
怎样打开一个文件才属于它要记录的
#15
这不好判断吧,如果手动打开“ 应用程序加载配置文件”那咋办???
#16
某个目录下有个test.pdf文件,然后打开这个文件,则记录这个文件,提示用户test.pdf文件被打开,呵呵,
这个就是楼主的意思了
这不好判断吧,如果手动打开“应用程序加载配置文件”那咋办???
这个就得问楼主了,看楼主怎么处理了,呵呵
这个就是楼主的意思了
这不好判断吧,如果手动打开“应用程序加载配置文件”那咋办???
这个就得问楼主了,看楼主怎么处理了,呵呵
#17
我晕,怎么搞的我像楼主似的。。。
#18
实际上楼主是你的马甲
#19
这才是重点啊,lz想好没???
#20
。。。
你就这点能耐?
瞎猜可不行
#21
当然我也有问题,不过我很难相信你能解决,不过你可以试试
获取system.exe创建文件的irp,这时候往下层发送irp 来create该文件的时候,会无限卡死,原因不明
首先说一下,不要去网上搜了,我搜遍了
网络os文件操作好像都是由system完成的,可以用这点来模拟
获取system.exe创建文件的irp,这时候往下层发送irp 来create该文件的时候,会无限卡死,原因不明
首先说一下,不要去网上搜了,我搜遍了
网络os文件操作好像都是由system完成的,可以用这点来模拟
#22
你是如何获取的,单单是system?
#23
恩,只有system,诺顿和国内杀软不兼容也类似。
获取就是create的irp下发前getcurrentpid
获取就是create的irp下发前getcurrentpid
#24
当然,杀软不兼容不仅仅这一点
#25
你是附加设备还是修改函数表
如果是这样你加载过滤的驱动程序后很快就卡死
如果是这样你加载过滤的驱动程序后很快就卡死
#26
谢谢 各位大侠的 建议和讨论...
虽然没解决(也许真的很难)但还是很有收获的...
这个贴在 放一放 没准那位大侠一下有思路了呢 \(^o^)/~
我也在查资料 但收获不大啊...
尤其感谢 Lactoferrin Delelebug 两位 O(∩_∩)O哈哈~ ...
你们交流 我学习
虽然没解决(也许真的很难)但还是很有收获的...
这个贴在 放一放 没准那位大侠一下有思路了呢 \(^o^)/~
我也在查资料 但收获不大啊...
尤其感谢 Lactoferrin Delelebug 两位 O(∩_∩)O哈哈~ ...
你们交流 我学习
#27
路过,围观。。。。。。。。。。。。
#28
用资源管理器打开文件时会查注册表找打开方式,你可以从这里下手,不过还是会漏掉一些
#29
不要拿别人当3岁小孩子,
你是如何获取的,单单是system? 这一句我本就不想回复,
我前面已经描述的很清楚的,包括重现方式
#30
你这言语态度不友好,不像讨论问题的,我并无恶意
#31
这句友好?你可以问问楼主我是否认识他
#32
仅是一句玩笑话,不必当真
#33
原来是这个导致不和谐,就当我放屁
#34
你这么说,我倒蛮不好意思的,当我上面也是放屁好了
#35
.....
晕了 两位
和谐 和谐 社会
O(∩_∩)O哈哈~ 咱这是学术研究 争执难免
其实 大家都是无恶意的 无心之举
这事怪我没早现身 昨天太忙了 sorry
晕了 两位
和谐 和谐 社会
O(∩_∩)O哈哈~ 咱这是学术研究 争执难免
其实 大家都是无恶意的 无心之举
这事怪我没早现身 昨天太忙了 sorry
#36
这贴结了重开吧,要不他俩不好意思在讨论了~~~
#37
最后的思路了 通过资源管理器了
╮(╯▽╰)╭ 只能试试看了...
╮(╯▽╰)╭ 只能试试看了...
#38
底层这里 看来时没办法了
╮(╯▽╰)╭...
╮(╯▽╰)╭...
#39
你的需求不就是获取文件名进行比较?
很奇怪啊 ?
在MINIFILTER下 进行路径名比较
是你需要监控的进行处理
不进行监控的返回COMPLETE 或者SUCCESS_NO_CALLBACK .
而比较的路径名并是由驱动固定死 由用户层通讯端传入
这样你想监控1.txt就监控1.txt 想监控2.doc就监控2.doc
区分不出来在想象别的办法
有名字比较为什么不能判断出来?
而且在别的回复轻易断定别人的想法不可行
这个是否太过武断了
因为我们本身的知识储备不足
一句话扼杀的可能是一个正确的方向
“
另外说一句,你这个想法
我只想获得我 想获取的最终目标文件 test.txt 其他的放过 不进行任何处理
不太现实”
这个完全可行 去别处自己想要的最终文件 其余全部放行 完全可以 毕竟你写的是过滤驱动
不是文件驱动FAT32 NTFS,放行让不关心的文件按原来的流程走 这个是很正常的
日志不是你打印的么 比较文件名 你感兴趣的才打印 感兴趣的放行即可
所有文件进行操作 无论是写入读取还是删除 重命名
都要经过CREATE 只要在MINIFILTER CREATE中进行路径比对 判断出来 完全可以。
手动打开 这个一样是经过文件系统的
#40
这位说的是SFILTER做法 一样是比较路径名 方法
很简单也很靠谱
之后的回复 都有点不知所云。。。。
#41
在create里判断文件是否是操作的那个文件,在底层不应该有这种想法。据我所知,在底层只能通过通信,才能知道应用层操作的文件名。
在create里可以通过比较文件名,判断一些标志位来滤掉大部分文件,但是具体哪个文件,无法判断。
其实你可以换个角度去考虑,比如处理内存,只要能实现你的功能就行。
在create里可以通过比较文件名,判断一些标志位来滤掉大部分文件,但是具体哪个文件,无法判断。
其实你可以换个角度去考虑,比如处理内存,只要能实现你的功能就行。
#42
#43
加个文件名过滤
#44
直接获取打开文件的文件名就可以了啊 有个file->filename可以得到文件打开的文件名
遍历这个文件名 用一个指针指向L"."就可以了啊 取得这个指针就行了啊
遍历这个文件名 用一个指针指向L"."就可以了啊 取得这个指针就行了啊