SetThreadToken() 是否使模拟令牌保持活动状态?



当主线程模拟客户端时,我的代码创建一个线程并使用SetThreadToken为其分配模拟令牌。然后主线程关闭令牌。

具体来说,主线程这样做:

  1. 使用LogonUser获取主令牌。
  2. 使用主令牌中的DuplicateToken获取模拟令牌。
  3. 呼叫ImpersonateLoggedOnUser
  4. 生成辅助线程并使用模拟令牌在线程上调用SetThreadToken
  5. RevertToSelf.
  6. CloseHandle模拟令牌和主令牌上。

此时,辅助线程仍在运行。即使主线程中的令牌句柄已关闭,模拟令牌是否仍可用于辅助线程?

Windows 内核对对象使用引用计数。TOKEN也是对象。 当您将令牌分配给线程(通过SetThreadToken(时,指向TOKEN对象的指针存储在ETHREAD对象中,并向TOKEN对象添加其他引用。 当然,内核不能依赖于关闭你或不是原始句柄(引用(到TOKEN对象。 这是一般的指针计数规则 - 如果A在自身中存储指向B的指针 -它添加了对B的引用,因为它将在A使用B之前有效。令牌将一直有效,直到线程不模拟另一个令牌,或者结束模拟或退出。无论如何,将令牌分配给线程后,您可以关闭它的句柄 - 令牌仍然有效


如果存在兴趣,内部SetThreadToken如何工作:

SetThreadToken使用ThreadImpersonationToken信息类调用NtSetInformationThread。 从内核端实现调用PsAssignImpersonationToken- 此 API 在ntifs.h中声明。 它的实现调用PsImpersonateClient哪个并引用传递的令牌。 结果,它成为分配给线程的有效实用程序

服务器线程可能已在模拟客户端,当 PsImpersonateClient 被调用。如果是这种情况,参考对表示该客户端的令牌的计数递减。

但无论如何 - 我们不需要这种内部知识 - 需要一般思考理解 - 对象引用计数。 如果指向令牌的指针保存在线程中 - 此令牌当然在被线程使用之前必须有效。 结果它引用了。 当线程停止使用此令牌(更改指针或退出(时 - 令牌取消引用

相关内容

  • 没有找到相关文章

最新更新