Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problemas al asignar privilegios a mi proceso (https://www.clubdelphi.com/foros/showthread.php?t=94650)

aguml 10-05-2020 10:12:50

Problemas al asignar privilegios a mi proceso
 
Buenas amigos, sigo con mi proyecto del debugger y alguien me dijo que podria ser problema de que el proceso que hace de debugger no puede tener los mismos privilegios que el proceso depurado y por eso no me deja poner bps y la funcion WriteProcessMemory falla.
Me dijo que para darle privilegios podria hacer algo asi:
Código PHP:

BOOL SetPrivilege(
    
HANDLE hProcess,          // access token handle
    
LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    
BOOL bEnablePrivilege   // to enable or disable privilege
    
){

    
HANDLE hToken NULL;
    
TOKEN_PRIVILEGES tp;
    
LUID luid;

    
//The OpenProcessToken function opens the access token associated with a process.
    /* An access token contains the security information for a logon session.
    The system creates an access token when a user logs on, and every process executed
    on behalf of the user has a copy of the token. The token identifies the user,
    the user's groups, and the user's privileges. The system uses the token to control
    access to securable objects and to control the ability of the user to perform various
    system-related operations on the local computer. There are two kinds of access token,
    primary and impersonation.
    */

    
if(!OpenProcessToken(hProcessTOKEN_ADJUST_PRIVILEGES, &hToken)){
            
ShowMessage(AnsiString().sprintf("OpenProcessToken() failed, error %u\n"GetLastError()));
            return 
FALSE;
    }

    if ( !
LookupPrivilegeValue(
            
NULL,            // lookup privilege on local system
            
lpszPrivilege,   // privilege to lookup
            
&luid ) )        // receives LUID of privilege
    
{
        
ShowMessage(AnsiString().sprintf("LookupPrivilegeValue error: %u\n"GetLastError()));
        return 
FALSE;
    }

    
tp.PrivilegeCount 1;
    
tp.Privileges[0].Luid luid;
    if (
bEnablePrivilege)
        
tp.Privileges[0].Attributes SE_PRIVILEGE_ENABLED;
    else
        
tp.Privileges[0].Attributes 0;

    
// Enable the privilege or disable all privileges.
    
if ( !AdjustTokenPrivileges(
           
hToken
           
FALSE
           &
tp
           
sizeof(TOKEN_PRIVILEGES), 
           (
PTOKEN_PRIVILEGESNULL
           (
PDWORDNULL) ){ 
        
ShowMessage(AnsiString().sprintf("AdjustTokenPrivileges error: %u\n"GetLastError()));
        return 
FALSE;
    }

    if (
GetLastError() == ERROR_NOT_ALL_ASSIGNED){
          
ShowMessage(AnsiString().sprintf("The token does not have the specified privilege."));
          return 
FALSE;
    }
    
CloseHandlehToken );
    return 
TRUE;


y la llamo así:
Código PHP:

if(!SetPrivilege(GetCurrentProcess(), SE_DEBUG_NAMETRUE)) {
            
ShowMessage(AnsiString().sprintf("Failed to enable privilege, error %u\n",GetLastError()));
            return 
false;
        } 

La funcion parece funcionar puesto que no me muestra ningun mensaje pero sigue pasandome lo mismo y WriteProcessMemory sigue sin poder escribir en el proceso depurado.
Me gustaria asegurarme de que se le ha dado los privilegios a mi aplicacion pero no se como hacerlo y no veo nada por la red. Lo unico que he encontrado es esta funcion y la verdad es que no se bien lo que hace y me muestra muchos mensajes con varios tipos de privilegios:
Código PHP:

bool ShowPrivileges()
{
    
// Get a token handle.
    
HANDLE hToken;
    if (!
OpenThreadToken(GetCurrentThread(), TOKEN_QUERYFALSE, &hToken))
    {
        if (!
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
            return 
false;
    }

    
// Get the token privilege information.
    
DWORD dwNeeded 0;
    
GetTokenInformation(hTokenTokenPrivilegesNULL0, &dwNeeded);
    
LPBYTE pBuffer = new BYTE[dwNeeded 1];
    
GetTokenInformation(hTokenTokenPrivilegespBufferdwNeeded, &dwNeeded);

    
// Cast to the proper type.
    
PTOKEN_PRIVILEGES pTokenPrivileges reinterpret_cast<PTOKEN_PRIVILEGES>(pBuffer);

    
// Iterate the privileges.
    
for (DWORD i 0pTokenPrivileges->PrivilegeCount; ++i)
    {
        
// Get and display the privilege name.
        
DWORD dwSize 0;
        
LookupPrivilegeName(NULL, &pTokenPrivileges->Privileges[i].LuidNULL, &dwSize);
        
LPSTR szName = new CHAR[dwSize 1];
        
LookupPrivilegeName(NULL, &pTokenPrivileges->Privileges[i].LuidszName, &dwSize);
        
ShowMessage(szName);
        
delete[] szName;
    }

    
delete[] pBuffer;

    
CloseHandle(hToken);
    return 
true;


¿Me podeis ayudar a ver si puedo ver si tiene privilegios de debug o no?
Gracias por adelantado

escafandra 10-05-2020 19:34:21

Process Explorer



Saludos.

aguml 10-05-2020 23:08:38

Con ella puedo ver los privilegios, dárselos, o qué hago con ella?

escafandra 10-05-2020 23:58:12

Cita:

Empezado por aguml (Mensaje 537172)
Con ella puedo ver los privilegios, dárselos, o qué hago con ella?

Con ella puedes ver los privilegios.

En general para escribir en la memoria de otro proceso tienes que tener privilegio igual o mayor . Con privilegios debug alcanzas casi a cualquier proceso. Para escribir en procesos System, necesitas correr tu aplicación como System.
Si te falla, estudia primero el mensaje de errir pata saber donde fallas.

Saludos.

escafandra 11-05-2020 01:26:59

Una cosa importante a la hora usar WriteProcessMemory y ReadProcessMemory que es obvio pero quiero comentar es que un proceso compilado para 32bits en principio no puede leer ni escribir en la memoria de otro de 64 bits, pero el camino contrario si es correcto. Esto se debe a incompatibilidad del tamaño de los punteros.

Mira a ver si este es tu caso.


Saludos.

aguml 11-05-2020 09:47:42

Las dos aplicaciones las hice yo con C++builder 6, tanto el debugger como el que uso para probarlo, y son de 32 bits. Si miro con Process Explorer veo esto antes de ejecutar el código que modifica los privilegios:
https://ibb.co/JBxXVwL
Y una vez ejecutada la función que me da los privilegios no ha cambiado absolutamente nada pero creo que es simplemente porque ya los tengo de entrada ¿no?
Entonces, si esto está bien, ¿lo siguiente es usar GetLastError después de intentar escribir en el proceso y ver que me dice?

aguml 11-05-2020 19:41:46

Comento que al final no hubo ningún problema al asignar esos privilegios en windows XP y era otro tema diferente el que me estaba dando problemas, simplemente que mi código estaba mal y sin darme cuenta desacia lo que en un principio hacia.
Lo que si me he dado cuenta que en Windows 10 me da error al intentar asignar ese privilegio a mi aplicación porque dice que no se encuentra el token. ¿Alguien me lo puede explicar?

escafandra 11-05-2020 19:41:57

Cita:

Empezado por aguml (Mensaje 537177)
¿lo siguiente es usar GetLastError después de intentar escribir en el proceso y ver que me dice?

Aclarado que ambos procesos son de 32 bits, todo depende si tienes un Handle válido para el proceso, de la zona de memoria del oto proceso que desees escribir, si es una zona nueva reservada (VirtualAllocEx), si estás escribiendo en su zona de datos o de código requiere permisos distintos sobre la zona de memoria (VirtualProtectEx), en fin, son varios detalles sobre los que hay que pensar y tener cuidado.


Saludos.

escafandra 11-05-2020 23:33:55

Cita:

Empezado por aguml (Mensaje 537183)
Comento que al final no hubo ningún problema al asignar esos privilegios en windows XP y era otro tema diferente el que me estaba dando problemas, simplemente que mi código estaba mal y sin darme cuenta desacia lo que en un principio hacia.
Lo que si me he dado cuenta que en Windows 10 me da error al intentar asignar ese privilegio a mi aplicación porque dice que no se encuentra el token. ¿Alguien me lo puede explicar?


No se como asignas privilegios pero deberías hacerlo siguiendo este método que funciona en todos los windows:


Para el proceso actual:
Código PHP:

BOOL EnablePrivilege (PCSTR nameBOOL Enable)
{
   
BOOL Result;
   
HANDLE hToken;
   
TOKEN_PRIVILEGES priv = {1, {00SE_PRIVILEGE_ENABLED}};
   if(!
Enablepriv.Privileges[0].Attributes 0;
   
LookupPrivilegeValueA(0name, &priv.Privileges[0].Luid);
   
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
   
AdjustTokenPrivileges(hTokenFALSE, &privsizeof priv00);
   
Result = (GetLastError() == ERROR_SUCCESS);
   
CloseHandle (hToken);
   return 
Result;



Por similitud, para cualquier proceso:
Código PHP:

BOOL EnablePrivilege (HANDLE hProcessPCSTR PrivNameBOOL Enable)
{
   
BOOL Result;
   
HANDLE hToken;
   
TOKEN_PRIVILEGES priv = {1, {00SE_PRIVILEGE_ENABLED}};
   if(!
Enablepriv.Privileges[0].Attributes 0;
   
LookupPrivilegeValueA(0PrivName, &priv.Privileges[0].Luid);
   
OpenProcessToken(hProcessTOKEN_ADJUST_PRIVILEGES, &hToken);
   
AdjustTokenPrivileges(hTokenFALSE, &privsizeof priv00);
   
Result = (GetLastError() == ERROR_SUCCESS);
   
CloseHandle (hToken);
   return 
Result;



Nota: No usa Unicode





Saludos.


La franja horaria es GMT +2. Ahora son las 20:08:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi