2009-05-14 3 views

Antwort

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

Auch wenn Sie PROCESS_ALL_ACCESS in Open verwenden möchten, können Sie dies versuchen:

#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

Ihr Code wird den ersten Prozess im System überspringen (erster Prozess ist jedoch höchstwahrscheinlich "SYSTEM", also kein vom Benutzer sichtbarer Fehler.) – Michael

+0

Der erste Prozess ist SYSTEM, also ist es in Ordnung (ich habe diesen Code direkt aus einem von Meine Projekte);) – xian

+0

Wenn ich versuche, auf dem hProcess zu handeln, erhalte ich Fehlercode 6, der ERROR_INVALID_HANDLE ist – Malfist

2

Check out: MSDN Article

Sie können GetModuleName verwenden (ich glaube?), Um den Namen zu erhalten und prüfen Sie dagegen.

+0

Die meisten GetModuleName, QueryFullProcessImage Name, etc., erfordern ein Handle und wird daher nicht viel nutzen. Toolhelp gibt den Prozessnamen zurück. – Michael

1

OpenProcess Funktion

Von MSDN:

Um ein Handle zu einem anderen lokalen Prozess zu öffnen und volle Zugriffsrechte zu erhalten, müssen Sie das SeDebugPrivilege Privileg aktivieren.

+0

Ich habe nicht die pID, nur der Name. – Malfist

+1

SeDebugPrivilege wird definitiv nicht für Prozesse benötigt, die wie Sie laufen. Wenn Sie über die ACL Zugriff auf den Prozess haben (was Sie normalerweise für Prozesse tun, die Sie auf derselben Integritätsstufe wie Ihr Code erstellen), benötigen Sie SeDebugPrivilege nicht. Aus derselben MSDN-Seite: Wenn der Anrufer die SeDebugPrivilege Berechtigung aktiviert ist, wird der angeforderte Zugriff unabhängig vom Inhalt der Sicherheitsbeschreibung gewährt. – Michael

+0

Ja, Sie müssen die Prozess-ID zuerst durch Iteration Prozesse erhalten. –

10

Es gibt zwei grundlegende Techniken. Der erste verwendet PSAPI; MSDN hat an example die EnumProcesses, OpenProcess, EnumProcessModules und GetModuleBaseName verwendet.

Die andere Verwendung Toolhelp, die ich bevorzuge. Verwenden Sie CreateToolhelp32Snapshot einen Snapshot der Prozessliste zu bekommen, gehen über sie mit Process32First und Process32Next, die Modulnamen und Prozess-ID liefert, bis Sie das Sie finden möchten, und dann OpenProcess rufen einen Griff zu bekommen.

14

Der folgende Code zeigt, wie Sie TOOLHELP und Open zu bekommen einen Handle für den Prozess verwenden können, . Die Fehlerbehandlung wurde der Kürze halber entfernt.

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

Sie haben eine Klammer in der Bedingung "if (MatchProcessName (process.szExeFile, name)" vergessen. –

+0

Wie xian's Antwort hat dies eine Racebedingung und ist von Natur aus unsicher. – benrg

+0

@Occulta 'if (string (process.szExeFile) == string (name)) 'kann anstelle dieser Funktion verwendet werden. Ich habe Michaels Antwort bearbeitet. – bytecode77

Verwandte Themen