Auf Speicher anderer Proogramm zugreifen



  • Hallo
    Ich bekomme von einem anderen Programm per SendMessage einen Pointer zu einem String, der aber im Process-Heap von dem Programm liegt, ich also nicht lesen kann.
    Aber wenn ich mich mit dem Debugger attach, und auf die Adresse im RAM zugreife, kann ich den String lesen.
    Daher:
    Wie sind die Befehle den Heap von anderen fremden Process's auszulesen?
    Danke im voraus!
    MFG
    Tristan



  • ReadProcessMemory (???)



  • Ist die andere Anwendung auch von dir?
    Dann nutze WM_COPYDATA.Ist speziell für diesen Fall gedacht.

    MfG Spacelord 🙂



  • Ich habe die Lösung gefunden und möchte das nicht vorenthalten:

    // 1. Den Process ID bekommen, ohne den gehts net:
        DWORD pid = NULL; // Speichert den Process ID
    
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
        PROCESSENTRY32 proc; 
        Process32First(snapshot, &proc);
        CString s;
        do{
               s = proc.szExeFile;
                   if(s.Right(10) == "WINAMP.EXE") {
                    pid = proc.th32ProcessID;
                break;
            }
    
        }while (TRUE == Process32Next(snapshot, &proc) );
        ASSERT(pid != NULL);
    
        CloseHandle(snapshot);
    // Jetzt den Process zum lesen öffnen:
    HANDLE hAmp = OpenProcess(PROCESS_VM_READ,false, pid);
    //und lesen:
    ReadProcessMemory( //Lesen
                     hAmp,  // handle of the process whose memory is read  
                     wp_sz, // address to start reading
                     tmp_buffer,// address of buffer to place read data
                     BUFF_SIZE-1,// number of bytes to read
                     NULL // address of number of bytes read
    );              
    CloseHandle(hAmp);
    

    Ich habe das gebraucht weil die WinAmp-API [link]http://www.winamp.com/nsdn/winamp2x/dev/sdk/api.jhtml[/link] den Namen von einem PlaylistItem nur als Pointer auf internen Speicher zurückgibt, also wäre es nur für Plugins(als DLL geladen) möglich. Daher für alle Interessierten, dieser Quelltext, ließt die ganze WinAMP PlayList aus, speichert sie in einem vector für char*

    vector<char*>PlayList; 
    HWND hWinamp = FindWindow("Winamp v1.x",NULL);
    ASSERT(hWinamp != NULL);
    
        DWORD pid = NULL;
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
        PROCESSENTRY32 proc; 
        Process32First(snapshot, &proc);
        CString s;
        do{
                   s = proc.szExeFile;
               if(s.Right(10) == "WINAMP.EXE"){
                   pid = proc.th32ProcessID;
                       break;
               }
    
        }while (TRUE == Process32Next(snapshot, &proc) );
        ASSERT(pid != NULL);
    
        CloseHandle(snapshot);
    
       HANDLE hAmp = OpenProcess(PROCESS_VM_READ,false, pid);
    
          int PlayListSize = SendMessage(hWinamp,WM_USER,0,124);
          DWORD size; 
          char* sz;
    #define BUFF_SIZE 80
          char tmp_buffer[BUFF_SIZE];
          for(int i=0;i<PlayListSize;i++)
          {
               char* wp_sz = (char*)SendMessage(hWinamp,WM_USER, i,212);
           ReadProcessMemory( hAmp, wp_sz, tmp_buffer, BUFF_SIZE-1, NULL); 
               size = lstrlen(tmp_buffer);
               sz = new char[size+1];
               CopyMemory(sz, tmp_buffer, size+1);
                       PlayList.push_back(sz);
          }
          CloseHandle(hAmp);
    

Anmelden zum Antworten