-
-
[原创]目标进程用户模式句柄转换为内核句柄
-
发表于: 2023-12-14 14:15 8817
-
网上很多方法都是Ring0内核进程和句柄互相转换的方法,查了一下没怎么看到说怎么将用户模式句柄转换为内核句柄的。如果内核获取到的是目标进程的句柄,拷贝到内核模式是不能直接使用的,会引发异常。
目前想到的实现思路是:
本人是菜鸟,各位师傅如果知道其他的方法跪求指点!!!
实现代码:
伪句柄转换为真实句柄,可以调用复制对象句柄的DuplicateHandle
。
微软官方在对此函数的解释中,说明了如果 hSourceHandle 是伪句柄, 会将其转换为进程或线程的实际句柄。
ObOpenObjectByPointer 函数 (ntifs.h) - Windows drivers | Microsoft Learn
ObReferenceObjectByHandle 函数 (wdm.h) - Windows drivers | Microsoft Learn
DuplicateHandle 函数 (handleapi.h) - Win32 apps | Microsoft Learn
伪句柄转换为真正的句柄 - 沉疴 - 博客园 (cnblogs.com)
NTSTATUS ConvertKernelHandle(
IN
HANDLE
UserHandle,
OUT
PHANDLE
KernelHandle,
POBJECT_TYPE ObjectType
)
{
NTSTATUS Status = STATUS_SUCCESS;
PVOID
Object = NULL;
//任意对象的体指针 EProcess EThread
LONG
v1 = (
LONG
)UserHandle;
if
(KernelHandle == NULL)
{
Status = STATUS_INVALID_PARAMETER;
goto
Exit;
}
if
(v1 <= 0)
{
*KernelHandle = UserHandle;
Status = STATUS_SUCCESS;
goto
Exit;
}
Status = ObReferenceObjectByHandle(
UserHandle,
0,
ObjectType,
UserMode,
&Object,
NULL
);
if
(Status != STATUS_SUCCESS)
{
goto
Exit;
}
Status = ObOpenObjectByPointer(
Object,
OBJ_KERNEL_HANDLE,
0,
0,
NULL,
KernelMode,
KernelHandle
);
if
(*KernelHandle == UserHandle) {
Status = STATUS_UNSUCCESSFUL;
}
Exit:
if
(Object != NULL) {
ObDereferenceObject(Object);
}
return
Status;
}
NTSTATUS ConvertKernelHandle(
IN
HANDLE
UserHandle,
OUT
PHANDLE
KernelHandle,
POBJECT_TYPE ObjectType
)
{
NTSTATUS Status = STATUS_SUCCESS;
PVOID
Object = NULL;
//任意对象的体指针 EProcess EThread
LONG
v1 = (
LONG
)UserHandle;
if
(KernelHandle == NULL)
{
Status = STATUS_INVALID_PARAMETER;
goto
Exit;
}
if
(v1 <= 0)
{
*KernelHandle = UserHandle;
Status = STATUS_SUCCESS;
goto
Exit;
}
Status = ObReferenceObjectByHandle(
UserHandle,
0,
ObjectType,
UserMode,
&Object,
NULL
);
赞赏记录
参与人
雪币
留言
时间
slcn
为你点赞~
2024-3-6 07:45
一笑人间万事
为你点赞~
2024-1-3 05:34
York Waugh
为你点赞~
2023-12-26 22:13
zhczf
为你点赞~
2023-12-15 09:20
赞赏
他的文章
- [原创]目标进程用户模式句柄转换为内核句柄 8818
- [原创]四种获取目标进程导入DLL模块地址的方法 11064
- [原创]Cpp20新特性面试重点 10135
看原图
赞赏
雪币:
留言: