欢迎来到 嗅灵易学

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

对象名字劫持,如何隐藏IRP DISPATCH HOOK

对象名字劫持,如何隐藏IRP DISPATCH HOOK

翻看大学写的代码,发现一段XXX代码,遂写成篇简单文章。
驱动程序中通过一个驱动对象名来获取对应的驱动对象通常是调用ObReferenceObjectByName,ObReferenceObjectByName的声明如下
NTSTATUS
ObReferenceObjectByName (
    __in PUNICODE_STRING ObjectName,
    __in ULONG Attributes,
    __in_opt PACCESS_STATE AccessState,
    __in_opt ACCESS_MASK DesiredAccess,
    __in POBJECT_TYPE ObjectType,
    __in KPROCESSOR_MODE AccessMode,
    __inout_opt PVOID ParseContext,
    __out PVOID *Object
    )
对象管理器就会根据ObjectName去遍历对应对象目录下的所有对象,看哪些对象的名字跟ObjectName匹配。那驱动对象的名字是存储在哪里呢?答案就是在
OBJECT_HEADER_NAME_INFO里面。
typedef struct _OBJECT_HEADER_NAME_INFO {
??? POBJECT_DIRECTORY Directory;?? //对象所属的路径
??? UNICODE_STRING Name;//对象名
??? ULONG QueryReferences;
} OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
那这样修改对象名,那通过ObReferenceObjectByName就无法获取到正确的驱动对象了。下面介绍如何隐藏IRP DISPATCH HOOK。
1) 调用ObReferenceObjectByName获取\FileSystem\ntfs对应的驱动对象的指针pDrvObj
2)替换掉你想要替换的DISPACTH指针
3)修改\FileSystem\ntfs这个名字
  OBJECT_HEADER* lpObjectHeader = NULL;
  POBJECT_HEADER_NAME_INFO lpObjectNameInfo = NULL;
  UNICODE_STRING uniXX;
  RtlInitUnicodeString (&uniXX, L"Hello 123");  
  RtlCopyUnicodeString(&pDrvObj->DriverName,&uniXX);
  lpObjectHeader = OBJECT_TO_OBJECT_HEADER(pDrvObj);
  lpObjectNameInfo = (POBJECT_HEADER_NAME_INFO)((DWORD)lpObjectHeader - (DWORD)lpObjectHeader->NameInfoOffset);
        RtlCopyUnicodeString(&lpObjectNameInfo->Name,&uniXX);
4) 保存好原来的驱动对象信息
  RtlCopyMemory(&pDrvObject,pDrvObj,sizeof(DRIVER_OBJECT));
5)用IoCreateDriverc创建一个同名的驱动对象,初始化DISPACTH指针为原始指针
NTKERNELAPI
NTSTATUS
IoCreateDriver(
    __in_opt PUNICODE_STRING DriverName,
    __in PDRIVER_INITIALIZE  DriverEntry
    );
任务完成。其他用途自由发挥。

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

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

0 0 0 举报
复制成功