Fichas de privilegios
Publicado: 08 Ago 2009, 20:42
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:
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í:
Publicado originalmente en: [Enlace externo eliminado para invitados]
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);
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;
}