3

我正在编写一个可以收集进程权限的日志服务,并且我正在尝试了解每个进程权限的属性。让我用这段代码解释一下:

HANDLE hToken;
if(OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
    DWORD dwSize = 0;
    if(!GetTokenInformation(hToken, TokenPrivileges, NULL, dwSize, &dwSize) &&
        ::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    {
        BYTE* pb = new (std::nothrow) BYTE[dwSize];
        if(pb)
        {
            TOKEN_PRIVILEGES* pTPs = (TOKEN_PRIVILEGES*)pb;
            DWORD dwSize2;
            if(GetTokenInformation(hToken, TokenPrivileges, pTPs, dwSize, &dwSize2) &&
                dwSize2 <= dwSize)
            {
                for(UINT i = 0; i < pTPs->PrivilegeCount; i++)
                {
                    //Analyze privilege attributes to understand if it's enabled or disabled?
                    DWORD dwPrivAttr = pTPs->Privileges[i].Attributes;

                    //...
                }
            }

            delete[] pb;
        }
    }

    CloseHandle(hToken);
}

那么让我们看看TOKEN_PRIVILEGES的结构,LUID_AND_ATTRIBUTES特别是:

#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
#define SE_PRIVILEGE_ENABLED            (0x00000002L)
#define SE_PRIVILEGE_REMOVED            (0X00000004L)
#define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)

看起来它被定义为位掩码,但这带来了以下解释这些标志的问题:

  1. ENABLED和 和有什么不一样ENABLED_BY_DEFAULT

  2. 它是什么SE_PRIVILEGE_USED_FOR_ACCESS以及如何使用?

  3. 如果两者SE_PRIVILEGE_ENABLEDSE_PRIVILEGE_REMOVED设置了怎么办?或者,重置?

  4. 我只是运行了一个简单的测试,并且对于我的过程,SeShutdownPrivilege特权将这些属性设置为0. 那么这应该是什么意思呢?

我对这个结构更加困惑,但我现在只讨论这些点。

谢谢!

4

2 回答 2

4

要按顺序回答您的问题:

  1. ENABLED_BY_DEFAULT表示该特权是进程启动时启用的特权之一。如果您有ENABLED但没有ENABLED_BY_DEFAULT,则该进程已显式启用该权限。如果您有ENABLED_BY_DEFAULT但没有ENABLED,则该进程已明确禁用该权限。

  2. 根据文档,SE_PRIVILEGE_USED_FOR_ACCESS在实际使用权限时设置。您可以将其用于故障排除,例如,检测您正在设置您实际未使用的权限,或通过实验确定特定系统调用需要哪些权限。(我从来没有检查过这是否真的像记录的那样,尽管我没有理由不这么认为。)

  3. 如果同时设置了SE_PRIVILEGE_ENABLEDSE_PRIVILEGE_REMOVED,则说明您在 Windows 中发现了一个错误。:-)

    如果既没有SE_PRIVILEGE_ENABLED也没有SE_PRIVILEGE_REMOVED设置,则权限存在于令牌中,并且尚未删除,但当前未启用。您可以使用AdjustTokenPrivileges()启用(或删除)它。

  4. 如果该属性为零,则该权限存在于令牌中,但当前未启用,尚未删除,默认情况下未启用,并且从未被进程使用。

于 2015-04-05T03:17:38.193 回答
0

我们中的一些人可能需要明确告知的是特权具有三种可能的状态,而不仅仅是两种。当我开始研究这些东西时,我认为一个进程要么有特权,要么没有特权。但事实证明,即使进程有特权,它也可以处于禁用状态。换句话说, disabled != 没有它。

其余的顺理成章。如果进程的访问令牌中不存在特权,则该进程没有该特权。反之亦然,如果进程没有特权,则该特权将不会出现在令牌中。

如果进程有权限,进程可以随意启用或禁用它,对吧?为什么这很有用?好吧,我可以猜想这允许您在不完全知道它们做什么的情况下调用库函数,并且如果它们做的比您想象的更多,它们就会失败......虽然很奇怪。

于 2016-06-17T16:47:30.330 回答