win7 x86中ObReferenceObjectByHandle对内核句柄和用户句柄的处理

内核句柄和用户句柄

内核句柄的值有KERNEL_HANDLE_MASK标识(小于0),用户句柄的值没有KERNEL_HANDLE_MASK(大于0)。

ObReferenceObjectByHandle

当句柄值不含有KERNEL_HANDLE_MASK标志时(用户句柄)

当句柄值为-1或-2时

当句柄值含有KERNEL_HANDLE_MASK标志时(内核句柄)

内核中使用ObReferenceObjectByHandle获取Object

在内核中利用3环的handle来获取Object(AccessMode == UserMode)

ObReferenceObject在执行到SuccessToHandleTable后,通过调用ExMapHandleToPointerEx函数来得到对应的Object。
ExMapHandleToPointerEx函数通过调用ExpLookupHandleTableEntry从句柄表HandleTable里寻找Object

ExpLookupHandleTableEntry函数会清除Handle的属性位后,判断handle的值是否大于句柄表中最大的句柄值。

到最后ExMapHandleToPointerEx就会返回,

在内核中利用0环的handle(内核handle)来获取Object(AccessMode == KernelMode)

以文件对象为例:利用文件对象名称获得对应的内核句柄,然后通过内核句柄获取对应的文件对象Object。

IO_STATUS_BLOCK IoStatusBlock = { 0 };
NTSTATUS Status;

//通过对象名称,得到对象内核句柄
InitializeObjectAttributes(
	&TempObjectAttributes,
	In_ObjectAttributes->ObjectName,
	OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
	TempRootDirectory,
	NULL
	);

Status = IoCreateFile(FileHandle,
	GENERIC_READ | SYNCHRONIZE,
	&TempObjectAttributes,
	&IoStatusBlock,
	0,
	FILE_ATTRIBUTE_NORMAL,
	FILE_SHARE_READ | FILE_SHARE_WRITE,
	FILE_OPEN,
	FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
	0,
	0,
	CreateFileTypeNone,
	0,
	IO_NO_PARAMETER_CHECKING
);

posted @ 2022-02-03 18:51  怎么可以吃突突  阅读(350)  评论(0编辑  收藏  举报