Página 1 de 1

Fichas de privilegios

Publicado: 08 Ago 2009, 20:42
por astarox
Muchas veces, si intentamos usar algunas APIs simplemente no funcionan, como por ejemplo [Enlace externo eliminado para invitados]. Esto es porque los privilegios que nuestro programa tiene por defecto no son lo suficientemente elevados.

Para matar un proceso, usariamos un códido similar a este:

Código: Seleccionar todo

printf(”Introduce el pID del proceso: “);
scanf (”%d”,&pID);

handleProceso = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
handleMuerto= TerminateProcess(handleProceso, 0);
Con el bloc de notas va bien :mrgreen:, pero intentalo con winlogon.exe o con el NOD32, simplemente la API [Enlace externo eliminado para invitados] pasa de ti. Para solucionar esto lo que vamos a hacer es darle privilegios de debugger a nuestro programa, para que pueda trastear a gusto.

No voy a explicarlo muy bien, si queréis más detalle solo mirad en la MSDN las tres APIs que usaremos: [Enlace externo eliminado para invitados], [Enlace externo eliminado para invitados] y [Enlace externo eliminado para invitados].

El código del programa sería así:

Código: Seleccionar todo

#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>

int EnableDebug()
{
    HANDLE hToken;     
    TOKEN_PRIVILEGES Debug_Privileges;           
    LUID luid;          

    if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
    {
        printf("Error en LookupPrivilege(), %d\n", GetLastError());
        CloseHandle (hToken);
        return false;
    }

    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
        printf("Error en OpenProcessToken(), %d\n", GetLastError());
        return false;
    }

    Debug_Privileges.PrivilegeCount = 1;
    Debug_Privileges.Privileges[0].Luid = luid;
    Debug_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if(!AdjustTokenPrivileges(hToken, FALSE, &Debug_Privileges, 0, NULL, NULL))
    {
        printf("Error en AdjustTokenPrivileges(), %d\n", GetLastError());
        CloseHandle (hToken);
        return false;
    }
}

int main(void)
{
    HANDLE hProcess, hSnapShot;
    BOOL hTerminate;
    int processID;

    if(!EnableDebug())
    {
        printf("No se pudieron dar privilegios.");
        return 0;
    }        

    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32* processInfo = new PROCESSENTRY32;
    processInfo->dwSize = sizeof(PROCESSENTRY32);

    printf("Lista de procesos: \n\n");
    while(Process32Next(hSnapShot, processInfo)!=FALSE)
	   printf("%s:%i\n", processInfo->szExeFile, processInfo->th32ProcessID);

    CloseHandle(hSnapShot);

    while(true)
    {
        printf("\nIntroduce el PID del proceso a terminar: ");
        scanf("%d", &processID);

        hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, processID);

        hTerminate = TerminateProcess(hProcess,	0);
    
        if(!hTerminate)
            printf("Error, GetLastError(): %u\n", GetLastError());
        else 
        	printf("Proceso terminado.\n");
    }
    
    return 1;
}
Publicado originalmente en: [Enlace externo eliminado para invitados]

Re: Fichas de privilegios

Publicado: 09 Ago 2009, 02:28
por Psymera
astarox escribió:Muchas veces, si intentamos usar algunas APIs simplemente no funcionan, como por ejemplo [Enlace externo eliminado para invitados]. Esto es porque los privilegios que nuestro programa tiene por defecto no son lo suficientemente elevados.

Para matar un proceso, usariamos un códido similar a este:

Código: Seleccionar todo

printf(”Introduce el pID del proceso: “);
scanf (”%d”,&pID);

handleProceso = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
handleMuerto= TerminateProcess(handleProceso, 0);
Con el bloc de notas va bien :mrgreen:, pero intentalo con winlogon.exe o con el NOD32, simplemente la API [Enlace externo eliminado para invitados] pasa de ti. Para solucionar esto lo que vamos a hacer es darle privilegios de debugger a nuestro programa, para que pueda trastear a gusto.

No voy a explicarlo muy bien, si queréis más detalle solo mirad en la MSDN las tres APIs que usaremos: [Enlace externo eliminado para invitados], [Enlace externo eliminado para invitados] y [Enlace externo eliminado para invitados].

El código del programa sería así:

Código: Seleccionar todo

#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>

int EnableDebug()
{
    HANDLE hToken;     
    TOKEN_PRIVILEGES Debug_Privileges;           
    LUID luid;          

    if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
    {
        printf("Error en LookupPrivilege(), %d\n", GetLastError());
        CloseHandle (hToken);
        return false;
    }

    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
        printf("Error en OpenProcessToken(), %d\n", GetLastError());
        return false;
    }

    Debug_Privileges.PrivilegeCount = 1;
    Debug_Privileges.Privileges[0].Luid = luid;
    Debug_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if(!AdjustTokenPrivileges(hToken, FALSE, &Debug_Privileges, 0, NULL, NULL))
    {
        printf("Error en AdjustTokenPrivileges(), %d\n", GetLastError());
        CloseHandle (hToken);
        return false;
    }
}

int main(void)
{
    HANDLE hProcess, hSnapShot;
    BOOL hTerminate;
    int processID;

    if(!EnableDebug())
    {
        printf("No se pudieron dar privilegios.");
        return 0;
    }        

    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32* processInfo = new PROCESSENTRY32;
    processInfo->dwSize = sizeof(PROCESSENTRY32);

    printf("Lista de procesos: \n\n");
    while(Process32Next(hSnapShot, processInfo)!=FALSE)
	   printf("%s:%i\n", processInfo->szExeFile, processInfo->th32ProcessID);

    CloseHandle(hSnapShot);

    while(true)
    {
        printf("\nIntroduce el PID del proceso a terminar: ");
        scanf("%d", &processID);

        hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, processID);

        hTerminate = TerminateProcess(hProcess,	0);
    
        if(!hTerminate)
            printf("Error, GetLastError(): %u\n", GetLastError());
        else 
        	printf("Proceso terminado.\n");
    }
    
    return 1;
}
Publicado originalmente en: [Enlace externo eliminado para invitados]
esta bueno el code
lo malo e ske no funca si no esta corriendo baj un user con privilegios de admin
pero ta weno el aporte