Uprawnienia debugowania

Uprawnienie do debugowania umożliwia komuś debugowanie procesu, do którego nie mieliby dostępu. Na przykład proces uruchomiony jako użytkownik z włączonym uprawnieniem debugowania w tokenie może debugować usługę działającą jako system lokalny.

Uprawnienia debugowania to ustawienie zasad zabezpieczeń, które umożliwia użytkownikom dołączanie debugera do procesu lub do jądra. Administrator może zmodyfikować zasady zabezpieczeń dla grupy użytkowników w celu uwzględnienia lub usunięcia tej funkcji. Deweloperzy, którzy debugują własne aplikacje, nie potrzebują tego uprawnienia użytkownika. Deweloperzy, którzy debugują składniki systemowe lub którzy debugują składniki zdalne, będą potrzebować tego uprawnienia użytkownika. To uprawnienie użytkownika zapewnia pełny dostęp do poufnych i krytycznych składników systemu operacyjnego. Domyślnie ta właściwość jest włączona dla użytkowników z uprawnieniami administratora. Użytkownik z uprawnieniami administratora może włączyć tę właściwość dla innych grup użytkowników.

Modyfikowanie uprawnień debugowania dla procesu

Poniższy przykład kodu pokazuje, jak włączyć uprawnienia debugowania w procesie. Dzięki temu można debugować inne procesy, do których nie masz dostępu.

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

W poniższym przykładzie pokazano, jak używać tej funkcji:

HANDLE hProcess=GetCurrentProcess();
HANDLE hToken;

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