首页
社区
课程
招聘
[讨论] 关于隐藏文件夹 附代码
发表于: 2011-12-21 10:25 14290

[讨论] 关于隐藏文件夹 附代码

2011-12-21 10:25
14290
学了文件过滤驱动,其实多少都要尝试下文件夹隐藏,网络上关于这些的讲解和代码都不少。
主要是使用文件过滤驱动 监控IRP_MJ_DIRECTORY_CONTROL的IRP,对其返回的FILE_BOTH_DIR_INFORMATION结构进行过滤和修改达到我们隐藏我们指定的文件夹的目的。

FILE_BOTH_DIR_INFORMATION结构体如下:

typedef struct _FILE_BOTH_DIR_INFORMATION {
  ULONG  NextEntryOffset;
  ULONG  FileIndex;
  LARGE_INTEGER  CreationTime;
  LARGE_INTEGER  LastAccessTime;
  LARGE_INTEGER  LastWriteTime;
  LARGE_INTEGER  ChangeTime;
  LARGE_INTEGER  EndOfFile;
  LARGE_INTEGER  AllocationSize;
  ULONG  FileAttributes;
  ULONG  FileNameLength;
  ULONG  EaSize;
  CCHAR  ShortNameLength;
  WCHAR  ShortName[12];
  WCHAR  FileName[1];
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;




最主要的 便是
ULONG  FileNameLength; 文件夹名字的长度 
WCHAR  FileName[1]; 文件夹的名字 
ULONG  NextEntryOffset; 下个FILE_BOTH_DIR_INFORMATION 结构体的距此处偏移。

因为一次返回的文件夹信息可能是多个的
每个文件夹信息之间的联系就靠NextEntryOffset来联系
在这一连串的FILE_BOTH_DIR_INFORMATION中我们只要过滤到我们想隐藏屏蔽的文件夹名 直接将它移除就好的
我这里使用的是MINIFILTER框架
//如果成功截获到FileBothDirectoryInformation的请求 ,开始做事  
if( Data->Iopb->MinorFunction == IRP_MN_QUERY_DIRECTORY && 
        (Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass == FileBothDirectoryInformation ) &&
        Data->Iopb->Parameters.DirectoryControl.QueryDirectory.Length > 0 &&
        NT_SUCCESS(Data->IoStatus.Status))
    {

 //比较文件夹名字若满足条件,隐藏之  
            if(_wcsnicmp(currentFileInfo->FileName,prefixName,wcslen(prefixName))==0 && (currentFileInfo->FileNameLength == 2))
            {   
                //改变偏移 把要隐藏的文件夹信息从里面摘除出来             
                if( nextOffset == 0 )
                {
                    previousFileInfo->NextEntryOffset = 0;
                }
                else
                {
                    previousFileInfo->NextEntryOffset = (ULONG)((PCHAR)currentFileInfo - (PCHAR)previousFileInfo) + nextOffset;
                }
        }
}



/*************************************************************************/
OK  测试成功 到此为止了
出现另个问题
win7下是不成功的 什么原因呢?
经过单步调试  发现WIN7 wista下 应该截获的结构体变成
FILE_ID_BOTH_DIR_INFORMATION
typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
  ULONG  NextEntryOffset;
  ULONG  FileIndex;
  LARGE_INTEGER  CreationTime;
  LARGE_INTEGER  LastAccessTime;
  LARGE_INTEGER  LastWriteTime;
  LARGE_INTEGER  ChangeTime;
  LARGE_INTEGER  EndOfFile;
  LARGE_INTEGER  AllocationSize;
  ULONG  FileAttributes;
  ULONG  FileNameLength;
  ULONG  EaSize;
  CCHAR  ShortNameLength;
  WCHAR  ShortName[12];
  LARGE_INTEGER  FileId;
  WCHAR  FileName[1];
} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;



其余大同小异 。
这里借用了
http://www.cnblogs.com/js2854/archive/2010/11/03/HideDir.html
[MiniFilter]驱动隐藏文件夹的实现(支持Win7) 一文中的代码
作者: js2854
出处: http://js2854.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

再次测试 再次OK
以上都成功了  但是有一个问题
隐藏名字为1的文件夹能成功么  结果是不能为什么?
因为名字为1的文件夹 很可能在文件信息的链中排第一 或者整个链只有他一个 这个时候以上的摘除手法都是无效的
这个时候我想查看下FASTFAT代码关于DIRCONTROL的代码
返回STATUS_NO_MORE_FILES 或者STATUS_NO_SUCH_FILE
结果是文件夹下啥都没了 这条路是行不通的。
我又想到 将IRP返回失败 并且 iostatus中的INFORMATION 也返回零 告知系统成功修改的字节数为零
并将其FILE_ID_BOTH_DIR_INFORMATION 全部填零
效果又如何?  要隐藏的名字为1的文件夹变为一个奇怪的文件。
效果不大尽如人意。

看来只有在虚拟机中慢慢调试吧
我新建一个空文件夹 刷新
看看文件夹下无任何东西 系统是怎么处理的
发现系统返回 filename  是 '.'
OK 再次测试

至此 我写上了第一行我自己写的代码(以上代码完全网络COPY
//	如果要隐藏的文件夹在FILE_BOTH_DIR_INFORMATION链中的第一个 需要特殊处理
RtlCopyMemory(currentFileInfo->FileName,L".",2);
				currentFileInfo->FileNameLength =0;
				FltSetCallbackDataDirty( Data );
				return FLT_POSTOP_FINISHED_PROCESSING;

XP虚拟机测试成功 附上代码  可隐藏文件夹名字为1或者2 这种及其容易排列在FILE_ID_BOTH_DIR_INFORMATION链第一位的命名
因为只针对这种很特殊的名字 极端情况下的文件夹隐藏
所以代码 测试不多
此处还可以扩展 加上线程识别 我们可以指定线程访问隐藏的文件夹
从而做出自己特有的隐藏文件夹访问器

另需要隐藏一般文件夹的同学 请自行网络搜索 或者将我代码加以改动

如果还有点用处的话
我将继续发布USB文件监控的学习笔记 谢谢

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
win7是FileIdBothDirectoryInformation
2011-12-21 10:34
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
收到
2011-12-21 11:07
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
拿走,  签名、、、、、
2011-12-21 11:15
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
线程识别,这个太精密了。。
2011-12-21 12:13
0
雪    币: 1580
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
能不能直接放个exe
2011-12-22 10:35
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
编译好SYS 和安装用得inf
都在里面了
隐藏指定的 名字为2 的文件夹还是指定名字为1 的文件夹
具体见代码
2011-12-22 10:41
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
顶一个
2011-12-22 10:51
0
雪    币: 11596
活跃值: (6949)
能力值: ( LV13,RANK:550 )
在线值:
发帖
回帖
粉丝
9
HideFilePostDirCtrl断点进不去请问什么原因
2017-5-19 23:06
0
雪    币: 6664
活跃值: (947)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习下
2017-5-20 06:30
0
游客
登录 | 注册 方可回帖
返回
//