Wie funktioniert ReadProcessMemory() ?



  • Hi, ich hab mich informiert, wie man den Speicher a us nem Programm ausliest, nur das Problem ist, dass ihc nicht weiß, wie ich die Parameter behandeln soll. Die MSDN sagt:
    ([url= "http://msdn2.microsoft.com/en-us/library/aa909195.aspx"]Link zum Eintrag[/url])

    BOOL WriteProcessMemory(
    HANDLE hProcess,
    LPVOID lpBaseAddress,
    LPVOID lpBuffer,
    DWORD nSize,
    LPDWORD lpNumberOfBytesWritten
    );

    Was soll ich denn überhaupt bei hProcess eingeben? Soll ich ne Instanz von der HPROCESS Klasse erstellen und dann den string zum Working Directory des Programms eingeben? Kann mir jemand ein Beispiel dazu geben?



  • hProcess ist das HANDLE auf den Process auf den Du zugreifen möchtest.

    An diesen kommst Du auf unterschiedliche Wege. Wenn Du ihn z.B. erst zur Laufzeit des Programms initialisierst CreateProcess() gibt Dir afaik ein Handle zurück.

    Wenn der Prozess bereits läuft kannst Du dir aus dem Quelltext z.B. ableiten wie man über den Namen an das Handle kommt. Leider habe ich den Link dazu nicht mehr kommt aber auch hier aus dem Forum. Vorsicht der Code beendet den Prozess auch also vor dem blinden ausführen genau hinschauen 😉

    int main()
    {
    KillProcessByName("test.exe");      // Anstatt Icq.exe halt "Test.exe" eingeben!
    return 0;
    }
    
    int KillProcessByName(char *szProcessToKill)
    {
    HANDLE hProcessSnap;
    HANDLE hProcess;
    PROCESSENTRY32 pe32;
    DWORD dwPriorityClass;
    
    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    
    if( hProcessSnap == INVALID_HANDLE_VALUE )
      {
        printError( "CreateToolhelp32Snapshot (of processes)" );
        return( 0 );
      }
    
    pe32.dwSize = sizeof( PROCESSENTRY32 );
    
    if( !Process32First( hProcessSnap, &pe32 ) )
      {
        printError( "Process32First" ); 
        CloseHandle( hProcessSnap );   
        return( 0 );
      }
    
    do{
        if(!strcmp(pe32.szExeFile,szProcessToKill))
          {
          printf("Prozess: %s \n",pe32.szExeFile);
          printf("PID: %d \n",pe32.th32ProcessID ); 
        hProcess = OpenProcess(PROCESS_TERMINATE,0, pe32.th32ProcessID);
        TerminateProcess(hProcess,0);
        CloseHandle(hProcess);
          }
      } while( Process32Next(hProcessSnap,&pe32) );
    
    CloseHandle( hProcessSnap );
    return( 1 );
    }
    
    void printError( TCHAR* msg )
    {
      DWORD eNum;
      TCHAR sysMsg[256];
      TCHAR* p;
    
      eNum = GetLastError( );
      FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
             NULL, eNum,
             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
             sysMsg, 256, NULL );
    
      // Trim the end of the line and terminate it with a null
      p = sysMsg;
      while( ( *p > 31 ) || ( *p == 9 ) )
        ++p;
      do { *p-- = 0; } while( ( p >= sysMsg ) &&
                              ( ( *p == '.' ) || ( *p < 33 ) ) );
    
      // Display the message
      printf( "\n  WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg );
    

    Hoffe das hilft Dir erstmal weiter


Anmelden zum Antworten