[Qt, C++] Probleme mit ReadProcessMemory()



  • Hallo,
    ich würde gerne einen sog. Code-Handler für PC-Spiele entwickeln. Dafür benötige ich aber die ReadProcessMemory() und Write ProcessMemory() Funktionen.
    Dabei habe ich mich an diesem Tutorial orientiert: https://www.youtube.com/watch?v=QwR8mBredEM

    Bei mir ist das Problem, dass kein Wert gelesen wird.

    DWORD pid;
    DWORD ammo = 0x002FF770;
    int myAmmo = 0;
    
    // unrelated code here
    
    void MainWindow::on_pushButton_clicked()
    {
        HWND hWnd = FindWindowA(0, ("test.exe"));
        GetWindowThreadProcessId(hWnd, &pid);
        HANDLE pHandle = OpenProcess(PROCESS_VM_READ, FALSE, pid);
        ReadProcessMemory(pHandle, (LPVOID)ammo, &myAmmo, sizeof(myAmmo), 0);
        ui->label->setText(QString::number(myAmmo));
    }
    

    Hatte jemand damit schon einmal zu tun gehabt?



  • Das ist eher eine WinAPI-Frage. Bei allen diesen Funktionen mußt du den Rückgabewert (bzw. Output-Parameter) entsprechend der Doku überprüfen.



  • Ok. Es scheint schon etwas mit der FindWindowA()-Funktion nicht zu stimmen.
    Der Debugger zeigt an: hwnd: unused <Speicher kann nicht gelesen werden>

    Setze ich beide Attribute von FindWindowA() auf 0 (FindwindowA(0, 0), dann bekomme ich den Fehler nicht. Kann aber nun kein spezifisches Programm auswählen.
    https://msdn.microsoft.com/de-de/library/windows/desktop/ms633499(v=vs.85).aspx



  • FindWindow sucht anhand des Window-Titels (nicht des Prozessnamens)!



  • Th69 schrieb:

    FindWindow sucht anhand des Window-Titels (nicht des Prozessnamens)!

    Ich weiß, und das funktioniert nicht.
    Um den Speicher des Windows-Rechners (calc.exe) lesen zu können, habe ich es mit "Rechner", "Calculator", "calc" und "calc.exe" versucht. Aber alles führte zum oben genannten Fehler



  • KratzKatz schrieb:

    Der Debugger zeigt an: hwnd: unused <Speicher kann nicht gelesen werden>

    Ja und? Wenn hWnd nicht 0 ist, war FindWindow erfolgreich. Dass du mit einem Fensterhandle eines fremden Prozesses nicht viel anfangen kannst, sollte dich nicht verwundern.

    Sieh dir die Dokumentation der verwendeten Funktionen an, und was sie im Fehlerfall machen.



  • Das ganze wollte so irgendwie nicht funktionieren.
    Damit ich später mir keine Sorgen machen, ob der Fenstertitel nun auch noch Unicode-Zeichen beinhaltet, kam ich auf die Idee, die Prozess-ID direkt über den Taskmanager zu bekommen.
    Das hat bestens Funktioniert und kann nun in andere Prozesse schreiben und von dort Werte lesen 🙂

    Hier eine Vorschau: https://www.youtube.com/watch?v=T_9yMGNnOHg


Log in to reply