代码之家  ›  专栏  ›  技术社区  ›  j6t

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

  •  0
  • j6t  · 技术社区  · 6 年前

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

    具体来说,主线程执行以下操作:

    1. 使用获取主令牌 LogonUser .
    2. DuplicateToken 从主令牌。
    3. 呼叫 ImpersonateLoggedOnUser
    4. 生成辅助线程并调用 设置线程令牌 在具有模拟标记的线程上。
    5. RevertToSelf .
    6. CloseHandle

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Community CDub    4 年前

    windows内核使用对象的引用计数。这个 TOKEN 也是一个对象。将令牌分配给线程时(通过 SetThreadToken )指向的指针 代币 ETHREAD 对象和附加引用添加到 对象。当然,内核不能依赖于是否关闭原始句柄(引用) 代币 A 存储指向的指针 B 在self-it中添加对 B ,因为有效期至 A 使用 B . 该令牌将一直有效,直到您的线程没有模拟另一个令牌,或者结束模拟或退出。无论如何,在您将令牌分配给线程之后,您可以关闭它的句柄-令牌仍然有效


    设置线程令牌 工作:

    设置线程令牌 NtSetInformationThread 具有 ThreadImpersonationToken 信息类。从内核端 implementation 打电话 PsAssignImpersonationToken ntifs.h公司 implementation call PsImpersonateClient 哪个和 传递的令牌。结果,它成为分配给线程的有效util

    服务器线程可能已经在模拟客户端 参考 计数 表示该客户机的令牌上的。

    参考计数 . 如果指向保存在线程中的令牌的指针-这个令牌在被线程使用之前当然必须是有效的。结果它引用了。当线程停止使用此令牌(更改指针或退出)时-令牌被取消引用