Privilégio de depuração

O privilégio de depuração permite que alguém depure um processo ao qual de outra forma não teria acesso. Por exemplo, um processo em execução como um usuário com o privilégio de depuração habilitado em seu token pode depurar um serviço em execução como sistema local.

O privilégio de depuração é uma configuração de política de segurança que permite aos usuários anexar um depurador a um processo ou ao kernel. Um administrador pode modificar uma política de segurança para que um grupo de usuários inclua ou remova essa funcionalidade. Os desenvolvedores que estão depurando seus próprios aplicativos não precisam desse privilégio de usuário. Os desenvolvedores que estão depurando componentes do sistema ou que estão depurando componentes remotos precisarão desse privilégio de usuário. Esse privilégio de usuário fornece acesso completo a componentes confidenciais e críticos do sistema operacional. Por padrão, essa propriedade é habilitada para usuários com direitos de administrador. Um usuário com privilégios de Administrador pode habilitar essa propriedade para outros grupos de usuários.

Modificando o privilégio de depuração para um processo

O exemplo de código a seguir mostra como habilitar o privilégio de depuração em seu processo. Isso permite que você depure outros processos aos quais você não teria acesso de outra forma.

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

O exemplo a seguir mostra como usar essa função:

HANDLE hProcess=GetCurrentProcess();
HANDLE hToken;

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