编写驱动拦截NT的API实现隐藏文件目录

转载 2004年07月26日 13:58:00
目前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)上测试通过!

对该文的评论
ico_pencil.gifTaShin ( 2003-11-27)
本代码在开发机器(WINXP+SP1+XPDDK)上测试通过!
程序框架请看lornwolf写的skykernel.c,这里不再列出!下载地址:
http://lornwolf.8u8.com/software/LornWolf.zip 
在此也感谢LornWolf。
ico_pencil.gifzxkl ( 2003-10-05)
我个人觉得文章的关键是如下一段:
4.在DriverEntry(驱动入口)函数中加入如下申明:

//保存真正的ZwQueryDirectoryFile函数地址

RealZwQueryDirectoryFile=(REALZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile));

//把自定义的替换函数指针指向真正的ZwQueryDirectoryFile函数

(REALZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile))=HookZwQueryDirectoryFile;

5.在DriverUnload(驱动卸载函数)函数中加入恢复代码:

//恢复原来的函数指针

(REALZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile))=RealZwQueryDirectoryFile;


我想问的是,如何具体地向DriverEntry函数中加入语句
ico_pencil.gifylc001 ( 2003-09-27)
有些SB连隐藏的目录都不知道怎么看,这个太高级了点
ico_pencil.gifmoonstone ( 2003-09-27)
Win2000 DDK下如何使用SYSCALL(...)?
为什么我编译时老提示错误:未定义的标识符?需要什么头文件吗?
ico_pencil.gifmoonstone ( 2003-09-27)
SYSTEMSERVICE()是什么东东?
我的是Win2000DDK,怎么找不到这个宏(?函数)?

编写驱动拦截NT的API实现隐藏文件目录(代码)

转载地址:http://www.cnblogs.com/qiuyi21/articles/1151923.html     网上流传的一篇文章《编写驱动拦截NT的API实现隐藏文件目录》,当时我在网上...
  • forever1dreamsxx
  • forever1dreamsxx
  • 2013年08月08日 14:14
  • 1064

驱动开发入门——NTModel

上一篇博文中主要说明了驱动开发中基本的数据类型,认识这些数据类型算是驱动开发中的入门吧,这次主要说明驱动开发中最基本的模型——NTModel。介绍这个模型首先要了解R3层是如何通过应用层API进入到内...
  • lanuage
  • lanuage
  • 2016年10月07日 23:57
  • 1227

驱动开发(3)使用SCM加载NT驱动(用应用程序加载驱动)

在上一篇中,我简单介绍编写了一个NT驱动空壳,这一篇中,将介绍如何自己编写一个驱动程序加载器,即使用编程的方法加载驱动,而不是使用工具。 我在上一篇中也提到了,驱动程序是通过服务加载的,我以前写过SC...
  • zuishikonghuan
  • zuishikonghuan
  • 2015年10月02日 11:02
  • 1684

NT式驱动和WDM式驱动程序

1.Windows驱动程序分为两类,一类是不支持即插即用功能的NT式的驱动程序;另一类是支持即插即用功能的WDM式的驱动程序。   2.NT式的驱动程序要导入的头文件时NTDDK.H,而WDM式的...
  • whatday
  • whatday
  • 2015年03月28日 15:27
  • 2760

驱动编程(一),NT - WDM - WDF 驱动概念

NT是驱动模型:NT式驱动程序模型是一种比较老式的驱动程序模型,但适用于现有的Windows系统。NT式驱动模型没有固定的形式,最简单的NT式驱动程序模型这一特点,程序开发者可以编写一个完全不支持硬件...
  • msk10k
  • msk10k
  • 2016年04月26日 16:02
  • 1457

NT式驱动安装卸载

TestDDK125096.sys #include void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject) { DbgPrint("...
  • qq125096885
  • qq125096885
  • 2015年05月20日 23:19
  • 476

NTModel框架与通信(含使用服务加载驱动)

原代码如下 #include #define DEVICE_NAME L"\\device\\NTModelDrv" #define LINK_...
  • zhuhuibeishadiao
  • zhuhuibeishadiao
  • 2016年03月31日 16:10
  • 787

NT Service 编程 操作 NT 服务

操作 NT 服务: OpenSCManager   打开目标计算机上的“服务控制管理器”-SCM,返回指向该管理器的指针。 OpenService     打开服务,返回指向该服务的指针。 St...
  • thanklife
  • thanklife
  • 2017年04月07日 16:29
  • 199

VC加载NT式驱动

标 题: 【原创】编写软件动态加载NT式驱动 作 者: epluguo 时 间: 2013-07-24,23:19:30 链 接: http://bbs.pediy.com/showthread.ph...
  • whatday
  • whatday
  • 2016年07月28日 14:39
  • 1016

驱动开发之 加载NT式驱动程序实例

下面是Driver.cpp #include "Driver.h" /***************************************************************...
  • liyun123gx
  • liyun123gx
  • 2014年07月09日 15:58
  • 857
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编写驱动拦截NT的API实现隐藏文件目录
举报原因:
原因补充:

(最多只允许输入30个字)