使用 win32api 确定令牌是主要令牌还是模拟令牌?
Determining whether a token is primary or impersonation using win32api?
假设我可以处理以下代码
pid = 1234
pHandle = win32api.OpenProcess(win32con.MAXIMUM_ALLOWED,pywintypes.FALSE,pid)
tHandle = win32security.OpenProcessToken(pHandle,win32con.MAXIMUM_ALLOWED)
我如何确定进程令牌是主要令牌还是模拟令牌?
进程令牌始终是主要令牌。所以这里没有什么可以确定的。线程令牌始终(如果存在)模拟令牌。所以当你打开进程或线程令牌时 - 你已经知道它的类型。所有 api 其中 return 令牌 - return 从开始令牌类型已知。唯一的情况是,当您需要确定令牌类型(未知)时 - 您枚举进程句柄并尝试检查令牌句柄。
为此,您需要使用 GetTokenInformation
with TokenType
,但实际上这种情况很少见,您可能会需要它。仅适用于某些调试实用程序。
c/c++
上的演示代码
ULONG GetTokenType(_In_ HANDLE hToken, _Out_ PTOKEN_TYPE ptp)
{
ULONG cb;
return GetTokenInformation(hToken, ::TokenType, ptp,
sizeof(TOKEN_TYPE), &cb) ? NOERROR : GetLastError();
}
void DemT()
{
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
TOKEN_TYPE tp;
// we already know that token is primary
if (GetTokenType(hToken, &tp) != NOERROR || tp != TokenPrimary)
{
__debugbreak();
}
CloseHandle(hToken);
if (0 <= NtImpersonateAnonymousToken(GetCurrentThread()))
{
if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken))
{
// we already know that token is impersonating
if (GetTokenType(hToken, &tp) != NOERROR || tp != TokenImpersonation)
{
__debugbreak();
}
CloseHandle(hToken);
}
SetThreadToken(0, 0);
}
}
}
假设我可以处理以下代码
pid = 1234
pHandle = win32api.OpenProcess(win32con.MAXIMUM_ALLOWED,pywintypes.FALSE,pid)
tHandle = win32security.OpenProcessToken(pHandle,win32con.MAXIMUM_ALLOWED)
我如何确定进程令牌是主要令牌还是模拟令牌?
进程令牌始终是主要令牌。所以这里没有什么可以确定的。线程令牌始终(如果存在)模拟令牌。所以当你打开进程或线程令牌时 - 你已经知道它的类型。所有 api 其中 return 令牌 - return 从开始令牌类型已知。唯一的情况是,当您需要确定令牌类型(未知)时 - 您枚举进程句柄并尝试检查令牌句柄。
为此,您需要使用 GetTokenInformation
with TokenType
,但实际上这种情况很少见,您可能会需要它。仅适用于某些调试实用程序。
c/c++
上的演示代码ULONG GetTokenType(_In_ HANDLE hToken, _Out_ PTOKEN_TYPE ptp)
{
ULONG cb;
return GetTokenInformation(hToken, ::TokenType, ptp,
sizeof(TOKEN_TYPE), &cb) ? NOERROR : GetLastError();
}
void DemT()
{
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
TOKEN_TYPE tp;
// we already know that token is primary
if (GetTokenType(hToken, &tp) != NOERROR || tp != TokenPrimary)
{
__debugbreak();
}
CloseHandle(hToken);
if (0 <= NtImpersonateAnonymousToken(GetCurrentThread()))
{
if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken))
{
// we already know that token is impersonating
if (GetTokenType(hToken, &tp) != NOERROR || tp != TokenImpersonation)
{
__debugbreak();
}
CloseHandle(hToken);
}
SetThreadToken(0, 0);
}
}
}