调试特权

调试权限允许某人调试他们本来无权访问的进程。 例如,在其令牌上启用了调试权限的用户身份运行的进程可以调试作为本地系统运行的服务。

调试权限是一种安全策略设置,允许用户将调试器附加到进程或内核。 管理员可以修改用户组的安全策略,以包括或删除此功能。 调试自己的应用程序的开发人员不需要此用户权限。 正在调试系统组件或正在调试远程组件的开发人员将需要此用户权限。 此用户特权提供对敏感和关键操作系统组件的完全访问。 默认情况下,为具有管理员权限的用户启用此属性。 具有管理员权限的用户可以为其他用户组启用此属性。

修改进程的调试权限

下面的代码示例演示如何在进程中启用调试权限。 这使你能够调试你无权访问的其他进程。

//
//  SetPrivilege enables/disables process token privilege.
//
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
    LUID luid;
    BOOL bRet=FALSE;

    if (LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
    {
        TOKEN_PRIVILEGES tp;

        tp.PrivilegeCount=1;
        tp.Privileges[0].Luid=luid;
        tp.Privileges[0].Attributes=(bEnablePrivilege) ? SE_PRIVILEGE_ENABLED: 0;
        //
        //  Enable the privilege or disable all privileges.
        //
        if (AdjustTokenPrivileges(hToken, FALSE, &tp, NULL, (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
        {
            //
            //  Check to see if you have proper access.
            //  You may get "ERROR_NOT_ALL_ASSIGNED".
            //
            bRet=(GetLastError() == ERROR_SUCCESS);
        }
    }
    return bRet;
}

以下示例演示如何使用此函数:

HANDLE hProcess=GetCurrentProcess();
HANDLE hToken;

if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
{
    SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
    CloseHandle(hToken);
}