我在我的用户模式进程中运行以下代码片段,该进程在 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;
}
在正常的事件流中,我希望获得
0x2000
的 SECURITY_MANDATORY_MEDIUM_RID
值,或 0x3000
的 SECURITY_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/