2009-05-14 13 views

Respuesta

62
#include <cstdio> 
#include <windows.h> 
#include <tlhelp32.h> 

int main(int, char *[]) 
{ 
    PROCESSENTRY32 entry; 
    entry.dwSize = sizeof(PROCESSENTRY32); 

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 

    if (Process32First(snapshot, &entry) == TRUE) 
    { 
     while (Process32Next(snapshot, &entry) == TRUE) 
     { 
      if (stricmp(entry.szExeFile, "target.exe") == 0) 
      { 
       HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); 

       // Do stuff.. 

       CloseHandle(hProcess); 
      } 
     } 
    } 

    CloseHandle(snapshot); 

    return 0; 
} 

Además, si desea utilizar PROCESS_ALL_ACCESS en OpenProcess, puede probar esto:

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

void EnableDebugPriv() 
{ 
    HANDLE hToken; 
    LUID luid; 
    TOKEN_PRIVILEGES tkp; 

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); 

    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); 

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

    AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL); 

    CloseHandle(hToken); 
} 

int main(int, char *[]) 
{ 
    EnableDebugPriv(); 

    PROCESSENTRY32 entry; 
    entry.dwSize = sizeof(PROCESSENTRY32); 

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 

    if (Process32First(snapshot, &entry) == TRUE) 
    { 
     while (Process32Next(snapshot, &entry) == TRUE) 
     { 
      if (stricmp(entry.szExeFile, "target.exe") == 0) 
      { 
       HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); 

       // Do stuff.. 

       CloseHandle(hProcess); 
      } 
     } 
    } 

    CloseHandle(snapshot); 

    return 0; 
} 
+4

Su código omitirá el primer proceso en el sistema (sin embargo, el primer proceso es probablemente "SISTEMA" por lo que no hay errores visibles para el usuario.) – Michael

+0

El primer proceso es SISTEMA, así que está bien (literalmente tomé ese código directamente de uno de mis proyectos);) – xian

+0

Cuando intento actuar en el hProcess obtengo el código de error 6 que es ERROR_INVALID_HANDLE – Malfist

2

Salida: MSDN Article

Puede utilizar GetModuleName (creo?) Para obtener el nombre y comprobar que en contra.

+0

La mayoría de los nombres GetModuleName, QueryFullProcessImage, etc., requieren un identificador y, por lo tanto, no serán de mucha utilidad. Toolhelp devuelve el nombre del proceso. – Michael

1

OpenProcess Función

De MSDN:

abrir un identificador a otro proceso local y obtener los derechos de acceso, debe habilitar el privilegio SeDebugPrivilege.

+0

No tengo el pID, solo el nombre. – Malfist

+1

SeDebugPrivilege definitivamente no es necesario para los procesos que se ejecutan como usted. Si tiene acceso al proceso a través de su ACL (que generalmente hace para los procesos que crea con el mismo nivel de integridad que su código), no necesita SeDebugPrivilege. Desde la misma página MSDN: Si la persona que llama ha habilitado el privilegio SeDebugPrivilege, el acceso solicitado se concede independientemente del contenido del descriptor de seguridad. – Michael

+0

Sí, primero necesita obtener la identificación del proceso al iterar los procesos. –

10

Hay dos técnicas básicas. El primero usa PSAPI; MSDN tiene an example que usa EnumProcesses, OpenProcess, EnumProcessModules y GetModuleBaseName.

El otro usa Toolhelp, que prefiero. Use CreateToolhelp32Snapshot para obtener una instantánea de la lista de procesos, camine sobre ella con Process32First y Process32Next, que proporciona el nombre del módulo y la ID del proceso, hasta que encuentre la que desea, y luego llame al OpenProcess para obtener un identificador.

14

El código siguiente muestra cómo se puede utilizar TOOLHELP y OpenProcess para obtener un identificador para el proceso de . Se eliminó el manejo de errores por brevedad.

HANDLE GetProcessByName(PCSTR name) 
{ 
    DWORD pid = 0; 

    // Create toolhelp snapshot. 
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    PROCESSENTRY32 process; 
    ZeroMemory(&process, sizeof(process)); 
    process.dwSize = sizeof(process); 

    // Walkthrough all processes. 
    if (Process32First(snapshot, &process)) 
    { 
     do 
     { 
      // Compare process.szExeFile based on format of name, i.e., trim file path 
      // trim .exe if necessary, etc. 
      if (string(process.szExeFile) == string(name)) 
      { 
       pid = process.th32ProcessID; 
       break; 
      } 
     } while (Process32Next(snapshot, &process)); 
    } 

    CloseHandle(snapshot); 

    if (pid != 0) 
    { 
     return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); 
    } 

    // Not found 


     return NULL; 
} 
+0

Ha olvidado un paréntesis en la condición "if (MatchProcessName (process.szExeFile, name)" –

+0

Al igual que la respuesta de xian, esta tiene una condición de carrera y es intrínsecamente insegura. – benrg

+0

@Occulta 'if (string (process.szExeFile) == string (name)) 'se puede usar en lugar de esta función. Edité la respuesta de Michael. – bytecode77

Cuestiones relacionadas