Debugberechtigung

Die Debugberechtigung ermöglicht es jemandem, einen Prozess zu debuggen, auf den er andernfalls keinen Zugriff hätte. Beispielsweise kann ein Prozess, der als Benutzer mit aktivierter Debugberechtigung für sein Token ausgeführt wird, einen Dienst debuggen, der als lokales System ausgeführt wird.

Debugberechtigung ist eine Sicherheitsrichtlinieneinstellung, mit der Benutzer einen Debugger an einen Prozess oder an den Kernel anfügen können. Ein Administrator kann eine Sicherheitsrichtlinie für eine Benutzergruppe ändern, um diese Funktionalität einzuschließen oder zu entfernen. Entwickler, die ihre eigenen Anwendungen debuggen, benötigen diese Benutzerberechtigung nicht. Entwickler, die Systemkomponenten debuggen oder Remotekomponenten debuggen, benötigen diese Benutzerberechtigung. Diese Benutzerberechtigung bietet vollständigen Zugriff auf sensible und kritische Betriebssystemkomponenten. Diese Eigenschaft ist standardmäßig für Benutzer mit Administratorrechten aktiviert. Ein Benutzer mit Administratorrechten kann diese Eigenschaft für andere Benutzergruppen aktivieren.

Ändern der Debugberechtigung für einen Prozess

Das folgende Codebeispiel zeigt, wie Sie die Debugberechtigung in Ihrem Prozess aktivieren. Dadurch können Sie andere Prozesse debuggen, auf die Sie andernfalls keinen Zugriff hätten.

//
//  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;
}

Im folgenden Beispiel wird die Verwendung dieser Funktion veranschaulicht:

HANDLE hProcess=GetCurrentProcess();
HANDLE hToken;

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