首页
社区
课程
招聘
[旧帖] [求助][求助]hook实现文件隐藏执行后蓝屏,求助!! 0.00雪花
发表于: 2015-12-6 22:39 2017

[旧帖] [求助][求助]hook实现文件隐藏执行后蓝屏,求助!! 0.00雪花

2015-12-6 22:39
2017
超级新手。。在网上找个了hook ZwQueryDirectoryFile实现文件隐藏的源码想学习一下,结果安装执行后,一点击隐藏的文件电脑就会蓝屏重启QAQ不知道什么原因。。。求大神帮忙!!
系统:win7 32位

源码如下:

#include "ntddk.h"

typedef BOOLEAN BOOL;
typedef unsigned long DWORD;
typedef DWORD * PDWORD;
typedef unsigned long ULONG;
typedef unsigned short WORD;
typedef unsigned char BYTE;
// This is our unload function
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
  unsigned int *ServiceTableBase;
  unsigned int *ServiceCounterTableBase;
  unsigned int NumberOfServices;
  unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

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;

// Our System Call Table
PVOID* NewSystemCallTable;

// Our Memory Descriptor List
PMDL pMyMDL;

#define HOOK_INDEX(function2hook) *(PULONG)((PUCHAR)function2hook+1)

#define HOOK(functionName, newPointer2Function, oldPointer2Function )  \
  oldPointer2Function = (PVOID) InterlockedExchange( (PLONG) &NewSystemCallTable[HOOK_INDEX(functionName)], (LONG) newPointer2Function)

#define UNHOOK(functionName, oldPointer2Function)  \
  InterlockedExchange( (PLONG) &NewSystemCallTable[HOOK_INDEX(functionName)], (LONG) oldPointer2Function)

NTSYSAPI
  NTSTATUS
  NTAPI ZwQueryDirectoryFile(
  IN  HANDLE FileHandle,
  IN  HANDLE Event OPTIONAL,
  IN  PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  IN  PVOID ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  OUT PVOID FileInformation,
  IN  ULONG Length,
  IN  FILE_INFORMATION_CLASS FileInformationClass,
  IN  BOOLEAN ReturnSingleEntry,
  IN  PUNICODE_STRING FileName OPTIONAL,
  IN  BOOLEAN RestartScan
  );

typedef NTSTATUS (*ZWQUERYDIRECTORYFILE)(
  IN  HANDLE FileHandle,
  IN  HANDLE Event OPTIONAL,
  IN  PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  IN  PVOID ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  OUT PVOID FileInformation,
  IN  ULONG Length,
  IN  FILE_INFORMATION_CLASS FileInformationClass,
  IN  BOOLEAN ReturnSingleEntry,
  IN  PUNICODE_STRING FileName OPTIONAL,
  IN  BOOLEAN RestartScan
  );

ZWQUERYDIRECTORYFILE        OldZwQueryDirectoryFile;

NTSTATUS NewZwQueryDirectoryFile(
  IN  HANDLE FileHandle,
  IN  HANDLE Event OPTIONAL,
  IN  PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  IN  PVOID ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  OUT PVOID FileInformation,
  IN  ULONG Length,
  IN  FILE_INFORMATION_CLASS FileInformationClass,
  IN  BOOLEAN ReturnSingleEntry,
  IN  PUNICODE_STRING FileName OPTIONAL,
  IN  BOOLEAN RestartScan
  )
{
  NTSTATUS status;
  ULONG CR0VALUE;

  ANSI_STRING ansiFileName,ansiDirName,HideDirFile;
  UNICODE_STRING uniFileName;
  RtlInitAnsiString(&HideDirFile,"HideFile"); 
  //DbgPrint("hide: NewZwQueryDirectoryFile called.");

  status = ((ZWQUERYDIRECTORYFILE)(OldZwQueryDirectoryFile)) (
    FileHandle,
    Event,
    ApcRoutine,
    ApcContext,
    IoStatusBlock,
    FileInformation,
    Length,
    FileInformationClass,
    ReturnSingleEntry,
    FileName,
    RestartScan);
  //这部分是隐藏文件的核心部分
  if(NT_SUCCESS(status)&&FileInformationClass==FileBothDirectoryInformation)
  {
    PFILE_BOTH_DIR_INFORMATION pFileInfo;
    PFILE_BOTH_DIR_INFORMATION pLastFileInfo;
    BOOLEAN bLastOne;
    int iPos,iLeft;
    pFileInfo = (PFILE_BOTH_DIR_INFORMATION)FileInformation; 
    pLastFileInfo = NULL;
    do
    {
      bLastOne = !( pFileInfo->NextEntryOffset );
      RtlInitUnicodeString(&uniFileName,pFileInfo->FileName);
      RtlUnicodeStringToAnsiString(&ansiFileName,&uniFileName,TRUE);
      RtlUnicodeStringToAnsiString(&ansiDirName,&uniFileName,TRUE);
      //DbgPrint("ansiFileName :%s\n",ansiFileName.Buffer);
      //DbgPrint("HideDirFile :%s\n",HideDirFile.Buffer);
      if( RtlCompareMemory(ansiFileName.Buffer,HideDirFile.Buffer,HideDirFile.Length ) == HideDirFile.Length)
      {
        KdPrint(("11111111"));
        if(bLastOne) 
        {
          pLastFileInfo->NextEntryOffset = 0;
          break;
        } 
        else //指针往后移动
        {
          
          iPos = ((ULONG)pFileInfo) - (ULONG)FileInformation;
          iLeft = (DWORD)Length - iPos - pFileInfo->NextEntryOffset;
          RtlCopyMemory( (PVOID)pFileInfo, (PVOID)( (char *)pFileInfo + pFileInfo->NextEntryOffset ), (DWORD)iLeft );
          continue;
        }
      }
      pLastFileInfo = pFileInfo;
      KdPrint(("%X",pFileInfo->NextEntryOffset));
      pFileInfo = (PFILE_BOTH_DIR_INFORMATION)((char *)pFileInfo + pFileInfo->NextEntryOffset);
      
    }while(!bLastOne);
    RtlFreeAnsiString(&ansiDirName); 
    RtlFreeAnsiString(&ansiFileName);
  }

  return status;
}

NTSTATUS Hook( )
{
  pMyMDL = MmCreateMdl(  NULL,
    KeServiceDescriptorTable.ServiceTableBase,
    KeServiceDescriptorTable.NumberOfServices * 4 );

  if( !pMyMDL )
    return( STATUS_UNSUCCESSFUL );

  MmBuildMdlForNonPagedPool( pMyMDL );
  pMyMDL->MdlFlags = pMyMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
  NewSystemCallTable = MmMapLockedPages( pMyMDL, KernelMode );

  if( !NewSystemCallTable )
    return( STATUS_UNSUCCESSFUL );

  // Add hooks here (remember to unhook if using DriverUnload)

  HOOK( ZwQueryDirectoryFile,NewZwQueryDirectoryFile ,OldZwQueryDirectoryFile);

  return( STATUS_SUCCESS );
}
NTSTATUS UnHook( )
{
  if( NewSystemCallTable )
  {
    UNHOOK( ZwQueryDirectoryFile, OldZwQueryDirectoryFile );
    MmUnmapLockedPages( NewSystemCallTable, pMyMDL );
    IoFreeMdl( pMyMDL );
  }
  return( STATUS_SUCCESS );
}

NTSTATUS OnUnload( IN PDRIVER_OBJECT DriverObject )

{
  NTSTATUS status;
  DbgPrint("OnUnload called\n");
  status=UnHook();
  return status;

}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,

  IN PUNICODE_STRING theRegistryPath)

{
  NTSTATUS       status = STATUS_SUCCESS;

  DbgPrint("I loaded!");

  // Initialize the pointer to the unload function
  theDriverObject->DriverUnload  = OnUnload;
  // in the DriverObject

  //hook
  Hook();

  return STATUS_SUCCESS;

}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Hi,在应用程序里创建一个事件,然后把句柄传过来,在内核模式构建出来对象,那么这个参数用KernelMode对吗?还是用UserMode啊? 请您 不吝赐教!!多谢!!
hEvent=*(HANDLE*)I.IoctlBuffer();
                        status = ObReferenceObjectByHandle(hEvent,
                        EVENT_MODIFY_STATE,
                        *ExEventObjectType,
                        KernelMode,
                        (PVOID*) &pEvent, NULL);
2015-12-16 18:17
0
游客
登录 | 注册 方可回帖
返回