Поддерживает ли SetThreadToken () токен олицетворения? - PullRequest
0 голосов
/ 17 октября 2018

В то время как основной поток олицетворяет клиента, мой код создает поток и назначает ему токен олицетворения, используя SetThreadToken.Затем основной поток закрывает токен.

В частности, основной поток делает это:

  1. Получите основной токен, используя LogonUser.
  2. Получите токен олицетворенияиспользование DuplicateToken из основного токена.
  3. Вызов ImpersonateLoggedOnUser.
  4. Создать вторичный поток и вызов SetThreadToken в потоке с токеном олицетворения.
  5. RevertToSelf.
  6. CloseHandle как для олицетворения, так и для первичного токена.

На этом этапе вторичный поток все еще работает.Токен олицетворения остается применимым для вторичного потока, даже если дескриптор токена был закрыт в основном потоке?

1 Ответ

0 голосов
/ 17 октября 2018

ядро ​​Windows использует подсчет ссылок на объекты.TOKEN тоже объект.когда вы назначаете токен потоку (через SetThreadToken), указатель на объект TOKEN сохраняется в объекте ETHREAD и дополнительная ссылка добавляется к объекту TOKEN.Конечно, ядро ​​не может полагаться на то, что вы закрываете или не используете оригинальный дескриптор (ссылку) на объект TOKEN.это общее правило подсчета указателей - если A хранит указатель на B в себе - оно добавляет ссылку на B, поскольку оно будет действительным до A использования B.токен будет действителен до тех пор, пока ваш поток не выдаст себя за другого токена, не прекратит олицетворение или не завершит работу.в любом случае, после того, как вы назначите токен потоку, вы можете закрыть его дескриптор - токен останется действительным


, если существует интерес, как внутреннее SetThreadToken работает:

SetThreadToken вызов NtSetInformationThreadс ThreadImpersonationToken информационным классом.со стороны ядра реализация называется PsAssignImpersonationToken - этот API объявлен в ntifs.h .это реализация вызов PsImpersonateClient который и ссылка переданный токен.в результате он становится действительным и используется назначенным потоку

Серверный поток уже может выдавать себя за клиента, когда вызывается PsImpersonateClient.Если это так, то счетчик ссылок на токене, представляющем этого клиента, уменьшается.

, но в любом случае - нам не нужны эти внутренние знания - нужны общие мысли - понимают - объект подсчет ссылок .если указатель на токен сохранен в потоке - этот токен должен быть действительным до тех пор, пока не будет использован потоком.в результате он ссылался.когда поток перестает использовать этот токен (изменить указатель или выйти) - разыменованный токен

...