首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法检查Nt Authority\系统SID

无法检查Nt Authority\系统SID
EN

Stack Overflow用户
提问于 2017-11-13 02:55:07
回答 1查看 180关注 0票数 0

我有一个可以由带有NT AUTHORITY\Network ServiceNT AUTHORITY\System的服务产生的进程,我需要检查它。所以我写了一个这样的代码:

代码语言:javascript
复制
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进行比较的正确方法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-11-14 02:02:27

您的代码泄漏了句柄和内存,但它确实在我的机器上提供了正确的结果。在您的系统上可能会有所不同,所以如果您打印出每个函数调用的结果和GetLastError来帮助您进行调试,这将非常有帮助。您还应该编写函数代码,以便能够区分错误和负面(成功)结果之间的区别。

代码语言:javascript
复制
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

当运行它时:

代码语言:javascript
复制
C:\windows\system32>c:\test.exe
isSystemUser=0    

C:\windows\system32>whoami
nt authority\system

有没有可能您实际上不是以真正的系统用户身份运行的?对于您的TokenUser,ConvertSidToStringSid返回什么?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47252634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档