能力值:
( LV2,RANK:10 )
|
-
-
2 楼
似乎就是renname
不过可以看看是不是和 DIRECTORY之类的文件夹 IRP有关
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我似乎用FileMon了看到了一个一个QueryDirectory,但是不知道是哪个IRP,怎样拦截
|
能力值:
( LV13,RANK:260 )
|
-
-
4 楼
贴代码...否则 这种问题 很难给出答复,或许你代码本身有写细节没注意而不是思路的问题
|
能力值:
( 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;
}
|
能力值:
( LV13,RANK:260 )
|
-
-
6 楼
同卷 是可行的,你的代码有问题,我下班后试了一下...
需要注意的是:
1. strstr(szBuf,PROTECTED) 这里的szBuf ,是 (SetFileInformation.InfoBuffer)->FileName 用户层穿过来的需要修改的路径
2. 路径是dos Name ,所以 PROTECTED 父目录应该是\\??\\X:\\ 的形式
3. 上图: 所以要好好检查 代码是否写得正确,提问的时候,最好能有所依据
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我的路径是
#define PROTECTED "\\DEVICE\\HARDDISKVOLUME1\\PROTECTED\\"
改成你的试试 ,不过前面测试也是可以拦截的
|
能力值:
( 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 的 来源...
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
真不懂啊,我的文件路径是从FltGetFileNameInformation和FltParseFileNameInformation中获取的,然后我用寒江独钓里面的那个函数转成大写的CHAR,用strstr比较,那个FileName来自内存?msdn好像是这样说的
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
我是基于minifilter的
|
能力值:
( LV13,RANK:260 )
|
-
-
11 楼
汗....你要监控是 修改后的文件路径名,你这里截获的是文件还未移动的文件名,肯定截获不到...要看 应用层传过来的 目录路径,也就是 data- > iopb -> para。。。->infobuffer ,这里的路径.... ps:额全程 参评,亲~~~ 给个好评.....
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
对了,亲,顺便帮我回答一个问题,我看网上的那些demo,比如隐藏文件都是在post例程里面拦截的,但似乎好像也可以在Pre里面拦截,这个重命名好像实在Pre里面拦截的,但似乎Post也可以拦截,请问这里有什么讲究嘛
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
真是有时间啊
我说RENAME就够了 难道还要DIRECTORY??
整了半天是rename BUFFER错误
|
能力值:
( LV13,RANK:260 )
|
-
-
15 楼
|
能力值:
( LV13,RANK:260 )
|
-
-
16 楼
这个 rename 应该在 pre 里面拦截, 如果你在post 里面拦截,文件 对应的修改已经成功,你还要往上面又要做一些回滚操作...pre 里面做方便,直接deny 就行, post 里面做你deny 后 还要做收尾工作
|
|
|