我正在用戶模式進程中運行以下代碼段,該進程在Windows用戶帳戶登錄到工作站時啓動。或者換句話說,其路徑被放置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
註冊表項中。什麼是0x2010的強制性完整性等級值?
該代碼應該確定我的用戶進程的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
的強制性完整性級別。
有誰知道這個值是什麼意思?
嗯。有趣。謝謝。我不知道這些級別可能是兩者之間的任意值。假設,我可以用MIL的'0x2123'運行我的用戶進程,對嗎? – c00000fd
@ c00000fd沒錯。它們只是任意值 - 當它們與其他進程的IL進行比較時,它們只有意義。 –
@JonathanPotter:好的。謝謝你們倆。我今天剛學到了一些新東西! – c00000fd