我在我的用户模式进程中运行以下代码片段,该进程在 Windows 用户帐户登录到工作站时启动。或者,换句话说,它的路径放在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 注册表项中。

该代码应该确定我的用户进程的 mandatory integrity level 。它是这样的:

DWORD getMIL()
{
    //Try to get integrity level
    //-1                                            Unknown
    //SECURITY_MANDATORY_UNTRUSTED_RID              0x00000000 Untrusted.
    //SECURITY_MANDATORY_LOW_RID                    0x00001000 Low integrity.
    //SECURITY_MANDATORY_MEDIUM_RID                 0x00002000 Medium integrity.
    //SECURITY_MANDATORY_MEDIUM_PLUS_RID            SECURITY_MANDATORY_MEDIUM_RID + 0x100 Medium high integrity.
    //SECURITY_MANDATORY_HIGH_RID                   0X00003000 High integrity.
    //SECURITY_MANDATORY_SYSTEM_RID                 0x00004000 System integrity.
    //SECURITY_MANDATORY_PROTECTED_PROCESS_RID      0x00005000 Protected process.
    DWORD dwIntgtyLvl = -1;

    HANDLE hToken;
    if(OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {

        DWORD dwSizeIntgtyLvl = 0;
        if(!GetTokenInformation(hToken, TokenIntegrityLevel, NULL, dwSizeIntgtyLvl, &dwSizeIntgtyLvl) &&
            ::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
            BYTE* pbIntgtyLvl = new BYTE[dwSizeIntgtyLvl];
            if(pbIntgtyLvl)
            {
                TOKEN_MANDATORY_LABEL* pTML = (TOKEN_MANDATORY_LABEL*)pbIntgtyLvl;
                DWORD dwSizeIntgtyLvl2;
                if(GetTokenInformation(hToken, TokenIntegrityLevel, pTML, dwSizeIntgtyLvl, &dwSizeIntgtyLvl2) &&
                    dwSizeIntgtyLvl2 <= dwSizeIntgtyLvl)
                {
                    dwIntgtyLvl = *GetSidSubAuthority(pTML->Label.Sid,
                        (DWORD)(UCHAR)(*GetSidSubAuthorityCount(pTML->Label.Sid)-1));
                }

                //Free mem
                delete[] pbIntgtyLvl;
                pbIntgtyLvl = NULL;
            }
        }

        ::CloseHandle(hToken);
    }

    return dwIntgtyLvl;
}

在正常的事件流中,我希望获得 0x2000SECURITY_MANDATORY_MEDIUM_RID 值,或 0x3000SECURITY_MANDATORY_HIGH_RID 值,但如果我已经登录了一个 Windows 用户帐户,然后切换用户并使用另一个用户帐户登录,上述方法将为我获取强制完整性级别的 0x2010 值。

有谁知道这个值代表什么?

最佳答案

您没有考虑完整性级别使用值范围,其中可以为 token /进程分配其完整性级别的值范围内的值。您只是在寻找特定的值。

不可信完整性可以是 SECURITY_MANDATORY_UNTRUSTED_RID(包含)和 SECURITY_MANDATORY_LOW_RID(非包含)之间的任何值。

低完整性可以是 SECURITY_MANDATORY_LOW_RID(包含)和 SECURITY_MANDATORY_MEDIUM_RID(非包含)之间的任何值。

中等完整性可以是 SECURITY_MANDATORY_MEDIUM_RID(包含)和 SECURITY_MANDATORY_HIGH_RID(非包含)之间的任何值。这就是您在示例中看到的内容。

高完整性可以是 SECURITY_MANDATORY_HIGH_RID(包含)和 SECURITY_MANDATORY_SYSTEM_RID(非包含)之间的任何值。
SECURITY_MANDATORY_SYSTEM_RID 或以上的任何值都为系统保留。

文档中有一个表格显示了这一点:

Windows Integrity Mechanism Design

表 2 定义的完整性级别和对应值

值 描述 符号

0x0000 不可​​信级别 SECURITY_MANDATORY_UNTRUSTED_RID
0x1000 低完整性级别 SECURITY_MANDATORY_LOW_RID
0x2000 中等完整性级别 SECURITY_MANDATORY_MEDIUM_RID
0x3000 高完整性级别 SECURITY_MANDATORY_HIGH_RID
0x4000 系统完整性级别 SECURITY_MANDATORY_SYSTEM_RID

关于c++ - 0x2010 的强制完整性级别值代表什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31151139/

10-11 16:18