CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

如何掩藏指定的文件夹?

楼主biliangxia(天下无双)2005-10-24 10:51:38 在 VC/MFC / 进程/线程/DLL 提问

如何掩藏指定的文件夹?  
  某些软件可以把文件放到回收站里去,究竟是怎么弄的.! 问题点数:100、回复次数:9Top

1 楼bohut(●伯虎● )回复于 2005-10-24 10:53:03 得分 58

转:  
   
  编写驱动拦截NT的API实现隐藏文件目录  
  目前NT下有很多种隐藏文件和目录的方法,其中最简单的一种是给文件和文件夹加上系统属性和隐藏属性,操作系统就会不在显示了,而且查找也找不到了,但是这种方法一点都不彻底,没有可用性!下面我们来介绍用NT驱动程序来拦截NTAPI来实现彻底隐藏文件和目录的目的。NT下有一个文件NTDLL.DLL,大部分NTAPI都是在这个库中封装的。其中实现查找文件和目录的API接口是ZwQueryDirectoryFile,所以我们只要拦截这个API的话,文件和目录就可以完全隐藏了!下面来一步不实现(准备工作:到NTDDK中找一个WDM驱动程序模型,也就是最简单的驱动程序了):  
   
            1.定义FILE_INFORMATION_CLASS的第3号结构:_FILE_BOTH_DIR_INFORMATION,这个结构是ZwQueryDirectoryFile必须参数。  
   
  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;  
   
     
   
  2.先申明ZwQueryDirectoryFile,然后定义ZwQueryDirectoryFile的原型:  
   
  extern   NTSYSAPI   NTSTATUS   NTAPI   ZwQueryDirectoryFile(  
                            IN   HANDLE   hFile,  
                            IN   HANDLE   hEvent   OPTIONAL,  
                            IN   PIO_APC_ROUTINE   IoApcRoutine   OPTIONAL,  
                            IN   PVOID   IoApcContext   OPTIONAL,  
                            OUT   PIO_STATUS_BLOCK   pIoStatusBlock,  
                            OUT   PVOID   FileInformationBuffer,  
                            IN   ULONG   FileInformationBufferLength,  
                            IN   FILE_INFORMATION_CLASS   FileInfoClass,  
                            IN   BOOLEAN   bReturnOnlyOneEntry,  
                            IN   PUNICODE_STRING   PathMask   OPTIONAL,  
                            IN   BOOLEAN   bRestartQuery);  
   
  //定义ZwQueryDirectoryFile的原型  
   
  typedef   NTSTATUS   (*REALZWQUERYDIRECTORYFILE)(IN   HANDLE   hFile,  
                          IN   HANDLE   hEvent   OPTIONAL,  
                          IN   PIO_APC_ROUTINE   IoApcRoutine   OPTIONAL,  
                          IN   PVOID   IoApcContext   OPTIONAL,  
                          OUT   PIO_STATUS_BLOCK   pIoStatusBlock,  
                          OUT   PVOID   FileInformationBuffer,  
                          IN   ULONG   FileInformationBufferLength,  
                          IN   FILE_INFORMATION_CLASS   FileInfoClass,  
                          IN   BOOLEAN   bReturnOnlyOneEntry,  
                          IN   PUNICODE_STRING   PathMask   OPTIONAL,  
                          IN   BOOLEAN   bRestartQuery);  
   
  //定义一个原函数指针  
  REALZWQUERYSYSTEMINFORMATION   RealZwQuerySystemInformation;  
   
  3.定义替换API函数的原型:  
   
  NTSTATUS   HookZwQueryDirectoryFile(    
                      IN   HANDLE   hFile,  
                      IN   HANDLE   hEvent   OPTIONAL,  
                      IN   PIO_APC_ROUTINE   IoApcRoutine   OPTIONAL,  
                      IN   PVOID   IoApcContext   OPTIONAL,  
                      OUT   PIO_STATUS_BLOCK   pIoStatusBlock,  
                      OUT   PVOID   FileInformationBuffer,  
                      IN   ULONG   FileInformationBufferLength,  
                      IN   FILE_INFORMATION_CLASS   FileInfoClass,  
                      IN   BOOLEAN   bReturnOnlyOneEntry,  
                      IN   PUNICODE_STRING   PathMask   OPTIONAL,  
                      IN   BOOLEAN   bRestartQuery);  
   
  4.在DriverEntry(驱动入口)函数中加入如下申明:  
   
  //保存真正的ZwQueryDirectoryFile函数地址  
   
  RealZwQueryDirectoryFile=(REALZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile));  
   
  //把自定义的替换函数指针指向真正的ZwQueryDirectoryFile函数  
   
  (REALZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile))=HookZwQueryDirectoryFile;  
   
  5.在DriverUnload(驱动卸载函数)函数中加入恢复代码:  
   
  //恢复原来的函数指针  
   
  (REALZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile))=RealZwQueryDirectoryFile;  
   
  6.现在准备工作做好了,函数指针都已经设置转向了,剩下的是实现这个我们自定义的替换函数HookZwQueryDirectoryFile,代码如下:  
   
  NTSTATUS   HookZwQueryDirectoryFile(  
          IN   HANDLE   hFile,  
          IN   HANDLE   hEvent   OPTIONAL,  
          IN   PIO_APC_ROUTINE   IoApcRoutine   OPTIONAL,  
          IN   PVOID   IoApcContext   OPTIONAL,  
          OUT   PIO_STATUS_BLOCK   pIoStatusBlock,  
          OUT   PVOID   FileInformationBuffer,  
          IN   ULONG   FileInformationBufferLength,  
          IN   FILE_INFORMATION_CLASS   FileInfoClass,  
          IN   BOOLEAN   bReturnOnlyOneEntry,  
          IN   PUNICODE_STRING   PathMask   OPTIONAL,  
          IN   BOOLEAN   bRestartQuery)  
  {  
    NTSTATUS   rc;  
    ULONG   CR0VALUE;  
     
    ANSI_STRING   ansiFileName,ansiDirName,HideDirFile;  
    UNICODE_STRING   uniFileName;  
     
    //初始化要过虑的文件名这里是debug.exe  
    RtlInitAnsiString(&HideDirFile,"DBGVIEW.EXE");    
     
    //   执行真正的ZwQueryDirectoryFile函数  
    rc   =   ((REALZWQUERYDIRECTORYFILE)(RealZwQueryDirectoryFile))(  
      hFile,    
      hEvent,  
      IoApcRoutine,  
      IoApcContext,  
      pIoStatusBlock,  
      FileInformationBuffer,  
      FileInformationBufferLength,  
      FileInfoClass,  
      bReturnOnlyOneEntry,  
      PathMask,  
      bRestartQuery);  
        /*如果执行成功(而且FILE_INFORMATION_CLASS的值为FileBothDirectoryInformation,我们就进行处理,过滤*/  
          if(NT_SUCCESS(rc)&&   (FileInfoClass   ==   FileBothDirectoryInformation))  
    {  
      PFILE_BOTH_DIR_INFORMATION   pFileInfo;  
      PFILE_BOTH_DIR_INFORMATION   pLastFileInfo;  
      BOOL   bLastOne;  
      //把执行结果赋给pFileInfo    
      pFileInfo   =   (PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer;    
      pLastFileInfo   =   NULL;  
      //循环检查  
      do  
      {  
        bLastOne   =   !(   pFileInfo->NextEntryOffset   );  
        RtlInitUnicodeString(&uniFileName,pFileInfo->FileName);  
        RtlUnicodeStringToAnsiString(&ansiFileName,&uniFileName,TRUE);  
        RtlUnicodeStringToAnsiString(&ansiDirName,&uniFileName,TRUE);  
        RtlUpperString(&ansiFileName,&ansiDirName);  
        //打印结果,用debugview可以查看打印结果  
        DbgPrint("ansiFileName   :%s\n",ansiFileName.Buffer);  
        DbgPrint("HideDirFile   :%s\n",HideDirFile.Buffer);  
         
        //   开始进行比较,如果找到了就隐藏这个文件或者目录  
        if(   RtlCompareMemory(ansiFileName.Buffer,HideDirFile.Buffer,HideDirFile.Length   )   ==   HideDirFile.Length)  
        {  
          DbgPrint("This   is   HideDirFile!\n");  
          if(bLastOne)    
          {  
            if(pFileInfo   ==   (PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer   )  
            {  
              rc   =   0x80000006;   //隐藏文件或者目录;  
            }  
            else  
            {  
              pLastFileInfo->NextEntryOffset   =   0;  
            }  
            break;  
          }    
          else   //指针往后移动  
          {  
            int   iPos   =   ((ULONG)pFileInfo)   -   (ULONG)FileInformationBuffer;  
            int   iLeft   =   (DWORD)FileInformationBufferLength   -   iPos   -   pFileInfo->NextEntryOffset;  
            RtlCopyMemory(   (PVOID)pFileInfo,   (PVOID)(   (char   *)pFileInfo   +   pFileInfo->NextEntryOffset   ),   (DWORD)iLeft   );  
            continue;  
          }  
        }  
        pLastFileInfo   =   pFileInfo;  
        pFileInfo   =   (PFILE_BOTH_DIR_INFORMATION)((char   *)pFileInfo   +   pFileInfo->NextEntryOffset);  
         
      }while(!bLastOne);  
      RtlFreeAnsiString(&ansiDirName);    
      RtlFreeAnsiString(&ansiFileName);  
    }  
    return(rc);  
  }  
   
  本代码在开发机器(WINXP+SP1+XPDDK)上测试通过!Top

2 楼teli_eurydice(哭泣的仙人掌。。。。)回复于 2005-10-24 11:02:22 得分 6

upTop

3 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-10-24 11:06:40 得分 6

收藏一下Top

4 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-10-24 12:20:37 得分 6

markTop

5 楼joncooper(小强)回复于 2005-10-24 12:23:59 得分 6

去driverdevelop上看看,你就知道,没有人用hook   api   来做隐藏了。Top

6 楼seansoe(www.sysmgmt.com.cn)回复于 2005-10-24 12:32:05 得分 6

markTop

7 楼biliangxia(天下无双)回复于 2005-10-24 13:26:42 得分 0

如何在另一台机器上也不能通过共享看到隐藏的文件呢?Top

8 楼gohappy_1999(碧水蓝天)回复于 2005-10-24 13:33:12 得分 6

markTop

9 楼joncooper(小强)回复于 2005-10-24 13:43:51 得分 6

写一个文件系统过滤驱动,有两种方法。一是attach   lanmandirector,2是attach   file   system.Top

相关问题

  • 如何指向指定的文件夹
  • 如何在一个指定的文件夹里新建一个子文件夹?
  • 如何遍历在指定文件夹及其子文件夹所有文件
  • 请问如何获取指定文件夹的大小?
  • 如何监视指定文件夹下的文件
  • 如何给某人邮箱中的指定文件夹发信?
  • 如何删除指定文件夹下的文件
  • 如何知道指定的文件夹是否已经存在
  • ★★★★★★★javascript如何遍历指定文件夹,请高手指教!急!
  • 如何在指定的文件夹新建Word文档?

关键词

  • 文件夹
  • 文件
  • 驱动
  • nt
  • pfileinfo
  • zwquerydirectoryfile
  • 隐藏
  • nextentryoffset
  • fileinformationbufferlength
  • fileinformationbuffer

得分解答快速导航

  • 帖主:biliangxia
  • bohut
  • teli_eurydice
  • goodboyws
  • oyljerry
  • joncooper
  • seansoe
  • gohappy_1999
  • joncooper

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo