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
);
分类:
windows内核编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)