-
-
[原创]对象名字劫持,如何隐藏IRP DISPATCH HOOK
-
发表于:
2012-2-11 22:37
13298
-
[原创]对象名字劫持,如何隐藏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
);
任务完成。其他用途自由发挥。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)