关于隐藏文件夹
学了文件过滤驱动,其实多少都要尝试下文件夹隐藏,网络上关于这些的讲解和代码都不少。
主要是使用文件过滤驱动 监控IRP_MJ_DIRECTORY_CONTROL的IRP,对其返回的FILE_BOTH_DIR_INFORMATION结构进行过滤和修改达到我们隐藏我们指定的文件夹的目的。FILE_BOTH_DIR_INFORMATION结构体如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; |
因为一次返回的文件夹信息可能是多个的
每个文件夹信息之间的联系就靠NextEntryOffset来联系
在这一连串的FILE_BOTH_DIR_INFORMATION中我们只要过滤到我们想隐藏屏蔽的文件夹名 直接将它移除就好的
我这里使用的是MINIFILTER框架
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //如果成功截获到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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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/
以上都成功了 但是有一个问题
隐藏名字为1的文件夹能成功么 结果是不能为什么?
因为名字为1的文件夹 很可能在文件信息的链中排第一 或者整个链只有他一个 这个时候以上的摘除手法都是无效的
这个时候我想查看下FASTFAT代码关于DIRCONTROL的代码
返回STATUS_NO_MORE_FILES 或者STATUS_NO_SUCH_FILE
结果是文件夹下啥都没了 这条路是行不通的。
我又想到 将IRP返回失败 并且 iostatus中的INFORMATION 也返回零 告知系统成功修改的字节数为零
并将其FILE_ID_BOTH_DIR_INFORMATION 全部填零
效果又如何? 要隐藏的名字为1的文件夹变为一个奇怪的文件。
效果不大尽如人意。看来只有在虚拟机中慢慢调试吧
我新建一个空文件夹 刷新
看看文件夹下无任何东西 系统是怎么处理的
发现系统返回 filename 是 '.'
OK 再次测试 至此 我写上了第一行我自己写的代码(以上代码完全网络COPY:D:)
1 2 3 4 5 | // 如果要隐藏的文件夹在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链第一位的命名
因为只针对这种很特殊的名字 极端情况下的文件夹隐藏
所以代码 测试不多
此处还可以扩展 加上线程识别 我们可以指定线程访问隐藏的文件夹
从而做出自己特有的隐藏文件夹访问器另需要隐藏一般文件夹的同学 请自行网络搜索 或者将我代码加以改动
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话