我的很多问题都在这里得到了解决,非常感谢你们。我还想再问一个。 :)
我正在阅读有关 < Windows via C/C++ > 的文章,它说:
当我们想要访问现有内核对象(而不是创建一个新内核对象)时,我们必须指定我们打算对该对象执行的操作。如果允许我们使用此类操作进行访问,则会返回内核对象的句柄。
...如果返回的句柄用于调用需要与您请求的权限不同的 API,则会发生拒绝访问错误。
据我所知,句柄只是一个普通的整数,它只是进程句柄表的索引,句柄值不能提供更多信息。如果我们已经获得了内核对象的句柄,系统如何检测到我们将它用于我们请求之外的其他操作?
一个内核对象可以有多个句柄,这些句柄的拥有者可能有不同的访问类型。系统在哪里存储这些不同的访问类型信息?我认为它应该在进程的句柄表中。
假设我尝试用 2 种不同的访问类型打开一个内核对象,应该返回同一个内核对象的 2 个句柄,因此进程的句柄表中将有 2 个条目,指向同一个内核对象.
任何见解将不胜感激。
更新1
谢谢你们。
我引用了
Windows 安全模型要求在打开一个对象时预先指定它希望对该对象执行什么类型的操作。对象管理器调用 SRM 以根据线程所需的访问权限执行访问检查,如果访问权限被授予,则将一个句柄分配给线程的进程,该线程(或进程中的其他线程)可以使用该句柄对线程执行进一步的操作目的。如第 3 章所述,对象管理器在进程的句柄表中记录授予句柄的访问权限。
看来我的猜测是对的。
谢谢。
最佳答案
每个处于事件状态的内核对象都将存储一系列针对它的权限。这只是另一个由安全引用管理器 (SRM) 管理的表。当对象管理器断言安全时,对象句柄将查找以收集对象引用 (ObReferenceObjectByHandle
) 和结果对象,可用于查找权限 (ObCheckObjectAccess
)。会有间接涉及安全 token ,但本质上这是理论。所以两个句柄可能确实指向同一个引用对象。
Windows Internals(我的第 5 版)中对 ObCheckObjectAccess
调用期间发生的情况有很好的描述。
这里解释一下:
ObCheckObjectAccess
获取对象、调用线程的凭据和请求的访问权限,并调用 SRM (SeAccessCheck
),以便确定是否正确断言或否认。
关于windows - 关于 Windows 内核对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4150756/