我有一个可以由带有NT AUTHORITY\Network Service或NT AUTHORITY\System的服务产生的进程,我需要检查它。所以我写了一个这样的代码:
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken)) {
GetTokenInformation(hToken, 1, 0, 0, &dwOut);
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
hTokenUser = (TOKEN_USER*)malloc( dwOut );
if (!GetTokenInformation(hToken, TokenUser, hTokenUser, dwOut, &dwOut))
return false;
}
else
return false;
PSID psid = NULL;
SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY;
AllocateAndInitializeSid(&ntAuth, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &psid);
if (EqualSid(psid, hTokenUser->User.Sid)) {
bResult = TRUE;
}
}因此,我所做的是,获取当前进程令牌,并使用GetTokenInfo从中获取SID,然后使用AllocateAndInitializeSid创建NT_AUTHORITY\System SID,然后将两个值进行比较,但是,当进程在NT_AUTHORITY\System检查下运行时,它永远不起作用。这是获取NT_AUTHORITY\System sid并将其与进程SID进行比较的正确方法吗?
发布于 2017-11-14 02:02:27
您的代码泄漏了句柄和内存,但它确实在我的机器上提供了正确的结果。在您的系统上可能会有所不同,所以如果您打印出每个函数调用的结果和GetLastError来帮助您进行调试,这将非常有帮助。您还应该编写函数代码,以便能够区分错误和负面(成功)结果之间的区别。
HRESULT isSystemUser()
{
HRESULT hr = E_FAIL;
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
TOKEN_USER *pTU = NULL;
DWORD dwOut;
GetTokenInformation(hToken, TokenUser, 0, 0, &dwOut);
hr = HRESULT_FROM_WIN32(GetLastError());
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
pTU = (TOKEN_USER*) malloc(dwOut), hr = E_OUTOFMEMORY;
if (pTU)
{
if (GetTokenInformation(hToken, TokenUser, pTU, dwOut, &dwOut))
{
PSID psid = NULL;
SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY;
if (AllocateAndInitializeSid(&ntAuth, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &psid))
{
hr = EqualSid(psid, pTU->User.Sid) ? S_OK : S_FALSE;
FreeSid(psid);
}
else
hr = HRESULT_FROM_WIN32(GetLastError());
}
else
hr = HRESULT_FROM_WIN32(GetLastError());
free(pTU);
}
CloseHandle(hToken);
}
else
hr = HRESULT_FROM_WIN32(GetLastError());
return hr;
}
...
printf("isSystemUser=%d\n", isSystemUser()); // 0 = true, 1 = false, < 0 = error当运行它时:
C:\windows\system32>c:\test.exe
isSystemUser=0
C:\windows\system32>whoami
nt authority\system有没有可能您实际上不是以真正的系统用户身份运行的?对于您的TokenUser,ConvertSidToStringSid返回什么?
https://stackoverflow.com/questions/47252634
复制相似问题