当前位置: 首页 > news >正文

Windows下内核文件隐藏技术

为防止此代码应用于一些触犯法律方面考虑,本篇文章仅讲述基本的逻辑方法,完整的代码将不会在文章中展示。
首先,我们要了解系统或者程序枚举文件的原理,它内部基本上就是调用查询API,然后在内核中会收到相关请求的IRP。
所以,我们要实现文件隐藏的话,基本上思路是有两个的:
1、阻断IRP请求,不允许查询。这种情况一般是隐藏整个目录使用的,而且这种方式波及的范围有点广。
2、正常处理IRP请求,但是我们需要对返回的结果进行处理,即从返回结果中删除我们要隐藏的文件。这种情况类似于hook,但是比hook更加的隐蔽、安全。
实现文件隐藏我们使用的是MiniFilter,这是微软提供给我们的内核驱动框架,所以还是非常安全的。逻辑非常简单,我们只需要注册 IRP_MJ_DIRECTORY_CONTROL 请求的回调函数处理返回结果即可。

一、注册相关回调函数

注册回调代码如下:

CONST FLT_OPERATION_REGISTRATION Callbacks[]={//文件隐藏{IRP_MJ_DIRECTORY_CONTROL,0,NULL,PostDirectoryControl,},{IRP_MJ_OPERATION_END}};

二、编写回调函数

回调函数的伪代码如下:

#defineDIR_ENTRY_NEXT_OFFSET(Entry)(*(PULONG)(Entry))#defineDIR_ENTRY_SET_NEXT_OFFSET(Entry,Value)(*(PULONG)(Entry)=(Value))FLT_POSTOP_CALLBACK_STATUSPostDirectoryControl(_Inout_ PFLT_CALLBACK_DATA Data,_In_ PCFLT_RELATED_OBJECTS FltObjects,_In_opt_ PVOID CompletionContext,_In_ FLT_POST_OPERATION_FLAGS Flags){ULONG nextOffset=0;BOOL removedAllEntries=TRUE;UNICODE_STRING strFilePathName;PFLT_FILE_NAME_INFORMATION nameInfo;PCHAR currentFileInfo=NULL;PCHAR blinkFileInfo=NULL;PCHAR previousFileInfo=NULL;LPWSTR pCurrentDir=NULL;UNREFERENCED_PARAMETER(FltObjects);UNREFERENCED_PARAMETER(CompletionContext);UNREFERENCED_PARAMETER(Data);UNREFERENCED_PARAMETER(Flags);if(FltObjects==NULL||FltObjects->FileObject==NULL||Data->Iopb->MinorFunction!=IRP_MN_QUERY_DIRECTORY||FlagOn(Flags,FLTFL_POST_OPERATION_DRAINING)){returnFLT_POSTOP_FINISHED_PROCESSING;}if(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.Length<=0||!NT_SUCCESS(Data->IoStatus.Status)){returnFLT_POSTOP_FINISHED_PROCESSING;}//数据长度ULONG dataLength=Data->Iopb->Parameters.DirectoryControl.QueryDirectory.Length;//获取目录/文件的相关数据if(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress!=NULL){currentFileInfo=(PCHAR)MmGetSystemAddressForMdlSafe(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress,NormalPagePriority);}else{currentFileInfo=(PCHAR)Data->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBuffer;}if(currentFileInfo==NULL)gotoFINAL;previousFileInfo=currentFileInfo;//保存下来blinkFileInfo=currentFileInfo;ULONG allOffsetLength=0;//循环遍历所有的数据while(TRUE){//距离下一个节点的偏移量nextOffset=DIR_ENTRY_NEXT_OFFSET(previousFileInfo);//匹配隐藏文件if(FindHideFile(Data,previousFileInfo,&pCurrentDir)){//判断是不是最后一个节点if(nextOffset==0){DIR_ENTRY_NEXT_OFFSET(blinkFileInfo)=0;}else{DIR_ENTRY_NEXT_OFFSET(blinkFileInfo)+=nextOffset;FltSetCallbackDataDirty(Data);}}else{removedAllEntries=FALSE;blinkFileInfo=previousFileInfo;}allOffsetLength+=nextOffset;previousFileInfo+=nextOffset;if(nextOffset==0||allOffsetLength>=dataLength)break;}FINAL:if(pCurrentDir){ExFreePoolWithTag(pCurrentDir,MINIFILTER_TAG);pCurrentDir=NULL;}returnFLT_POSTOP_FINISHED_PROCESSING;}

查找隐藏文件的代码如下,部分代码已隐藏,以备注代替:

//查找是否是隐藏文件BOOLFindHideFile(_Inout_ PFLT_CALLBACK_DATA pData,PCHAR pActual,LPWSTR*pCurrentDir){BOOL isRet=FALSE;DWORD fileNameLength=0;LPCWSTR pFileName=NULL;if(pData==NULL||pActual==NULL)gotoFINAL;switch(pData->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass){caseFileDirectoryInformation:fileNameLength=((PFILE_DIRECTORY_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_DIRECTORY_INFORMATION)pActual)->FileName;break;caseFileFullDirectoryInformation:fileNameLength=((PFILE_FULL_DIR_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_FULL_DIR_INFORMATION)pActual)->FileName;break;caseFileBothDirectoryInformation:fileNameLength=((PFILE_BOTH_DIR_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_BOTH_DIR_INFORMATION)pActual)->FileName;break;caseFileNameInformation:fileNameLength=((PFILE_NAMES_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_NAMES_INFORMATION)pActual)->FileName;break;caseFileIdFullDirectoryInformation:fileNameLength=((PFILE_ID_FULL_DIR_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_ID_FULL_DIR_INFORMATION)pActual)->FileName;break;caseFileIdBothDirectoryInformation:fileNameLength=((PFILE_ID_BOTH_DIR_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_ID_BOTH_DIR_INFORMATION)pActual)->FileName;break;caseFileIdExtdDirectoryInformation:fileNameLength=((PFILE_ID_EXTD_DIR_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_ID_EXTD_DIR_INFORMATION)pActual)->FileName;break;caseFileIdGlobalTxDirectoryInformation:fileNameLength=((PFILE_ID_GLOBAL_TX_DIR_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_ID_GLOBAL_TX_DIR_INFORMATION)pActual)->FileName;break;caseFileIdExtdBothDirectoryInformation:fileNameLength=((PFILE_ID_EXTD_BOTH_DIR_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_ID_EXTD_BOTH_DIR_INFORMATION)pActual)->FileName;break;case79://FileId64ExtdBothDirectoryInformation (win11 23H2以后)fileNameLength=((PFILE_ID_64_EXTD_BOTH_DIR_INFORMATION)pActual)->FileNameLength;pFileName=((PFILE_ID_64_EXTD_BOTH_DIR_INFORMATION)pActual)->FileName;break;default:gotoFINAL;}if(fileNameLength<=0||pFileName==NULL)gotoFINAL;FINAL:returnisRet;}

这里对目录/文件信息处理的时候,需要根据类型转换相应的结构,然后从数据结构中找到对应的目录名/文件名。上述对目录名/文件名的获取应该覆盖了目前大部分的系统,起码我测试的win7、win8、win10、win11以及同样内核版本的server系统的x64版本是都没有问题的。

OK,目前文件隐藏的所有逻辑就已经结束了,如果还有不懂MiniFilter框架的,后边我可能会出一个MiniFilter的教程,或者大家可以去其他的地方先学习一下这个框架。

http://www.jsqmd.com/news/775048/

相关文章:

  • 将Taotoken集成到自动化工作流中实现智能内容批量处理
  • 基于Laravel与私有AI的Noton文档平台:自托管部署与实战指南
  • AISMM模型成熟度评估全解析(附2024最新打分细则与组织自测速查表)
  • qt:QList和ExtraSelection
  • Armv9-A架构Cortex-A720核心寄存器解析与应用
  • Automation1Studio 界面七 Transformation(坐标变换)​ 设置界面
  • YOLO11涨点优化:损失函数优化 | 引入EIoU与Focal Loss结合,同时解决包围框宽高比例与正负样本不平衡问题
  • 低空经济新蓝海:一网统管平台如何支持“低空+城市治理“?
  • 软件测试生产验证缺陷常见流程
  • 2026AI大模型API代理站亲测:五大平台硬核数据横评,为开发者提供权威选型指南
  • 3分钟掌握iOS位置模拟神器:iFakeLocation跨平台实战指南
  • 麻省理工新工具:虚拟小提琴提前试音效,助力制琴师设计
  • 找不到童年游戏?小霸王游戏机珍藏84合1免费下载一键搞定
  • 静态路由拓展配置实验
  • 量子深度学习硬件平台与软件工具解析
  • ChanlunX:通达信缠论分析插件的技术实现与应用实践
  • BuildingAI 上部署自定义工作流智能体:5 个实用技巧
  • 【独家首发】奇点大会闭门报告实录:AISMM在金融/医疗/制造三大场景的ROI测算模型(含2027Q1商用倒计时)
  • SGR Agent Core:基于Schema-Guided Reasoning的深度研究智能体框架解析
  • TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
  • 量子计算四支柱协议:评估量子优势的系统方法论
  • OpenClaw安全审计工具:本地优先、低依赖的自动化配置与密钥泄露检测
  • 3大技术突破:Whisky如何让Windows程序在macOS上原生运行
  • 融资“狂飙”:月之暗面半年吸金超39亿美元,DeepSeek估值450亿“等梁文锋点头”
  • 前端开发选 VSCode 还是 Sublime Text 配置更灵活?
  • 基于腾讯地图Map Skills与LLM Agent的端到端智能出行规划系统设计与实现
  • AgentRAG vs 传统RAG:AI检索的“智慧”升级
  • AISMM落地学术界仅剩90天:3大不可逆趋势、5类高危研究陷阱与2026必争技术制高点
  • RK3588 MIPI-CSI摄像头调试避坑指南:从硬件连接到闪光灯驱动修改
  • YOLO11涨点优化:Loss魔改 | Alpha-IoU 暴力替换CIoU,通过幂指数调节放大高IoU样本的梯度,提升定位精度