我在这里解决了很多问题,非常感谢你们。我想再问一次。 :)
我正在阅读< Windows通过C / C ++>,它说:
当我们想获得对现有内核对象的访问权(而不是创建一个新对象)时,我们必须指出我们打算对该对象执行的操作。如果允许我们使用此类操作进行访问,则返回内核对象的句柄。
...如果返回的句柄用于调用需要与您请求的权限不同的API,则会发生访问拒绝错误。
AFAIK,handle只是一个普通的整数,它只是进程'句柄表的索引,句柄值不能提供。如果我们已经获得了内核对象的句柄,那么系统如何检测我们是否将其用于我们请求的其他操作?
内核对象可以有多个句柄,这些句柄的所有者可能具有不同的访问类型。系统在哪里存储这些不同的访问类型信息?我认为它应该在进程'句柄表中。
假设我尝试使用2种不同的访问类型打开单个内核对象,应返回同一内核对象的2个句柄,因此进程'handle table中将有2个条目,指向同一个内核对象
任何见解都将深受赞赏。
谢谢你们。
我提到了< Windows Internals>第5版,它在第6章说。访问检查:
Windows安全模型要求therad在预设对象时预先指定要在对象上执行的操作类型。对象管理器调用SRM根据线程的所需访问权执行访问检查,如果授予访问权限,则为线程的进程分配一个句柄,线程(或进程中的其他线程)可以使用该句柄对该线程执行进一步的操作。宾语。如第3章所述, 对象menager记录为进程句柄表中的句柄授予的访问权限。
所以看来我的猜测是正确的。
感谢。
答案 0 :(得分:2)
每个活动的内核对象都会对其存储一系列权限。这只是安全参考管理器(SRM)管理的另一个表。当对象管理器声明安全性时,将查找对象句柄以收集对象引用(ObReferenceObjectByHandle
),并且结果对象可用于查找权限(ObCheckObjectAccess
)。将存在涉及安全令牌的间接,但实质上这是理论。所以两个句柄可能确实指向同一个引用对象。
有一个很好的描述在Windows Internals(我的版本5)ObCheckObjectAccess
调用期间发生的事情。
在此解释:
ObCheckObjectAccess
获取对象,调用线程的凭据和请求的访问权限,并调用SRM(SeAccessCheck
),以便它可以确定权限是被断言还是被拒绝。