读取文件和注册表句柄信息

在编写驱动进行HOOK的时候,我们经常会需要从某参数获取相关信息,最常见的就是从进程、文件、注册表句柄中获取相关路径以进行相关保护。其中关于从进程句柄获取信息的方法我已经在 《SSDT HOOK实现进程保护》 一文中给出了方法,今天我们就给出文件和注册表句柄的处理方法。
      下面首先看通过HOOK ZwSetInformationFile保护文件防删除的方法,这个函数的第一个参数FileHandle给定了文件路径,但是我们该怎么获取这个路径呢?核心函数在于ObReferenceObjectByHandle,下面是示例代码:

PFILE_OBJECT        pFileObject;
UNICODE_STRING      DosName;
UNICODE_STRING      uniFileName;
ANSI_STRING         aniFileName;

ObReferenceObjectByHandle(FileHandle, 0 , 0 , KernelMode, & pFileObject, NULL );
IoVolumeDeviceToDosName(pFileObject -> DeviceObject, & DosName);

KdPrint(( "[nokyo] %s%s" , DosName.Buffer, pFileObject -> FileName.Buffer));

ExFreePool(DosName.Buffer);
ObDereferenceObject(pFileObject);

      上述代码是我从自己的程序中抽出来的,没有亲自测试可靠性,还望各位读者在使用前能先测试一下,ring0的程序可不是闹着玩的。
下面我们再来看HOOK ZwDeleteValueKey防止删除注册表键的方法:

PVOID              pKey;
PUNICODE_STRING    pUniName;
UNICODE_STRING     ustrReg;

ObReferenceObjectByHandle(KeyHandle, 0 , 0 , KernelMode, & pKey, NULL );
pUniName = ExAllocatePool(NonPagedPool, 1024 );
ObQueryNameString(pKey, pUniName, 1024 , & nRet);
    
RtlInitUnicodeString( & ustrReg, L" \\ REGISTRY \\ MACHINE \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Run" );
    
if (RtlCompareUnicodeString(pUniName, & ustrReg, TRUE) == 0 )
{
    ExFreePool(pUniName);
    ObDereferenceObject(pKey);
    
     return STATUS_ACCESS_DENIED;
}

      其中ObQueryNameString的声明如下所示:

NTSYSAPI
NTSTATUS
NTAPI
ObQueryNameString(
    IN  PVOID                Object,
    OUT PVOID                ObjectNameInfo,
    IN  ULONG                Length,
    OUT PULONG                ReturnLength
);

好了,核心代码基本上都放出来了,剩下的就是你自己动手测试了。注意使用ZwQueryInformationFile和ZwQueryKey也可以获得相关信息,但不是完整路径。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值