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

时间:2018-10-17 08:13:53

标签: winapi windows-security

虽然主线程模拟了一个客户端,但是我的代码创建了一个线程,并使用SetThreadToken向其分配了模拟令牌。然后主线程关闭令牌。

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

  1. 使用LogonUser获取主令牌。
  2. 使用DuplicateToken从主要令牌中获得模拟令牌。
  3. 致电ImpersonateLoggedOnUser
  4. 生成第二个线程,并使用模拟令牌在线程上调用SetThreadToken
  5. RevertToSelf
  6. CloseHandle涉及模拟和主要令牌。

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

1 个答案:

答案 0 :(得分:0)

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


如果存在兴趣,内部B的工作方式:

SetThreadTokenSetThreadToken信息类调用NtSetInformationThread。从内核implementationPsAssignImpersonationToken的调用-此api在 ntifs.h 中声明。 implementation call PsImpersonateClient,并引用所传递的令牌。结果,它成为分配给线程的有效util

  

服务器线程可能已经在模拟客户端   调用PsImpersonateClient。在这种情况下,参考   计数代表客户的令牌已减少。

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