首页
社区
课程
招聘
[求助]同卷文件的剪切是哪个IRP?如何拦截
发表于: 2011-12-15 14:28 9441

[求助]同卷文件的剪切是哪个IRP?如何拦截

2011-12-15 14:28
9441
我拦截了IRP_MJ_CREATE的FILE_CREATE,FILE_OPEN_IF,FILE_OVERWRITE,FILE_OVERWRITE_IF和IRP_MJ_SET_INFORMATION的FileRenameInformation

这样做能阻止拷贝文件到我保护的文件夹,和创建新的文件

但是同卷的文件却可以直接剪切到我的文件夹,而不被拦截,不是说同卷的剪切就是rename吗,我已经拦截IRP_MJ_SET_INFORMATION的FileRenameInformation了

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

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
似乎就是renname

不过可以看看是不是和 DIRECTORY之类的文件夹 IRP有关
2011-12-16 14:49
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我似乎用FileMon了看到了一个一个QueryDirectory,但是不知道是哪个IRP,怎样拦截
2011-12-16 15:11
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
4
贴代码...否则 这种问题 很难给出答复,或许你代码本身有写细节没注意而不是思路的问题
2011-12-16 15:56
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

PreCreate里面的拦截:
			if(strstr(szBuf,PROTECTED) > 0)
			{
				//
				// 不在白名单的拦截
				//
				if (!Ps_IsCurrentProcessInWhiteList())
				{
					if (FILE_OPEN == uCreateOptions)
					{
						KdPrint(("Fsflt.sys: (PreCreate) FilePath = %s [Open Option (ID = 0x%08lx)] is Blocked!\n",szBuf,uCreateOptions));
						Data->IoStatus.Status = STATUS_ACCESS_DENIED;
						Data->IoStatus.Information = 0;
						return FLT_PREOP_COMPLETE;
					}
					if ((FILE_CREATE == uCreateOptions) || (FILE_OPEN_IF == uCreateOptions) || (FILE_OVERWRITE == uCreateOptions) || (FILE_OVERWRITE_IF == uCreateOptions) )
					{
						//	能阻止编辑保存,阻止创建,阻止复制,但是不能阻止同卷拖曳(拦截rename还是不行)
						KdPrint(("Fsflt.sys: (PreCreate) FilePath = %s [Create Option (ID = 0x%08lx)] is Blocked!\n",szBuf,uCreateOptions));
						Data->IoStatus.Status = STATUS_ACCESS_DENIED;
						Data->IoStatus.Information = 0;
						return FLT_PREOP_COMPLETE;
					}
					//__leave;
				}


PreSetInfomation里面的拦截:
			if (strstr(szBuf,PROTECTED) > 0)
			{
				if (Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileRenameInformation )
				{
					//已经拦截了rename,能阻止在保护文件夹里面的rename了
					//但是不能拦截将同卷文件剪切到保护文件夹里面
					KdPrint(("Fsflt.sys: (PreSetInfomation) FilePath = %s [Rename Option] is Blocked!\n",szBuf));
					Data->IoStatus.Status = STATUS_ACCESS_DENIED;
					Data->IoStatus.Information = 0;
					return FLT_PREOP_COMPLETE;
				}

				if (Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileDispositionInformation )
				{
					KdPrint(("Fsflt.sys: (PreSetInfomation) FilePath = %s [Delete Option] is Blocked!\n",szBuf));
					Data->IoStatus.Status = STATUS_ACCESS_DENIED;
					Data->IoStatus.Information = 0;
					return FLT_PREOP_COMPLETE;
				}

				if (Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileBasicInformation)
				{
					KdPrint(("Fsflt.sys: (PreSetInfomation) FilePath = %s [Set Attributes Option] is Blocked!\n",szBuf));
					Data->IoStatus.Status = STATUS_ACCESS_DENIED;
					Data->IoStatus.Information = 0;
					return FLT_PREOP_COMPLETE;
				}
2011-12-16 16:07
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
6
同卷 是可行的,你的代码有问题,我下班后试了一下...
需要注意的是:
1. strstr(szBuf,PROTECTED)  这里的szBuf ,是 (SetFileInformation.InfoBuffer)->FileName 用户层穿过来的需要修改的路径

2. 路径是dos Name  ,所以 PROTECTED 父目录应该是\\??\\X:\\ 的形式

3. 上图:

所以要好好检查 代码是否写得正确,提问的时候,最好能有所依据  
上传的附件:
2011-12-16 18:21
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我的路径是
#define  PROTECTED "\\DEVICE\\HARDDISKVOLUME1\\PROTECTED\\"

改成你的试试,不过前面测试也是可以拦截的
2011-12-16 20:34
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
8
呵呵 你没看懂....

typedef struct _FILE_RENAME_INFORMATION {
    BOOLEAN ReplaceIfExists;
    HANDLE RootDirectory;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;

好好 调试一下 这个结构总 filename 的 来源...
2011-12-16 20:43
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
真不懂啊,我的文件路径是从FltGetFileNameInformation和FltParseFileNameInformation中获取的,然后我用寒江独钓里面的那个函数转成大写的CHAR,用strstr比较,那个FileName来自内存?msdn好像是这样说的
2011-12-18 12:43
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我是基于minifilter的
2011-12-18 12:44
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
11
汗....你要监控是 修改后的文件路径名,你这里截获的是文件还未移动的文件名,肯定截获不到...要看 应用层传过来的 目录路径,也就是  data- > iopb -> para。。。->infobuffer ,这里的路径....

ps:额全程 参评,亲~~~ 给个好评.....
2011-12-19 22:19
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我说呢。。明白了,这个跟要隐藏文件的做法一样的路径都是从应用层进来的。。。
额,参考了网上代码,思维定向了

,http://bbs.pediy.com/showthread.php?t=143970,这里有个100kx的题目,没人回答,你要是回答下,就给你了
2011-12-20 08:34
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
对了,亲,顺便帮我回答一个问题,我看网上的那些demo,比如隐藏文件都是在post例程里面拦截的,但似乎好像也可以在Pre里面拦截,这个重命名好像实在Pre里面拦截的,但似乎Post也可以拦截,请问这里有什么讲究嘛
2011-12-20 09:04
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
真是有时间啊
我说RENAME就够了 难道还要DIRECTORY??
整了半天是rename BUFFER错误
2011-12-20 09:23
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
15
没事的时候随便写了点~~~
2011-12-20 09:59
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
16
这个 rename 应该在 pre 里面拦截, 如果你在post 里面拦截,文件 对应的修改已经成功,你还要往上面又要做一些回滚操作...pre 里面做方便,直接deny 就行, post 里面做你deny 后 还要做收尾工作
2011-12-20 10:06
0
游客
登录 | 注册 方可回帖
返回
//