ReadProcessMemory char readen



  • Hallo
    Bin am C++ lernen.
    Ich habe aus dem Windows Spiel Minesweeper erfolgreich die Variable "Zeit"
    aus dem Ram gelesen und geändert. Jetzt wollte ich das bei einem Spiel machen
    den der Name meines Charakters ausgeben. Aber das Funktioniert nicht mehr.

    #include <windows.h>
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    int main(void)
    {
        HWND hWnd;
        HANDLE hproc;
        DWORD procid;
        DWORD rw = 0;
    
        unsigned RamCharname = 0x00C208F8;
    
        char *buffer;
    
        hWnd = FindWindow(0,"Spielname");
        if(!hWnd)
            cout << "Opfer Programm nicht gefunden\nBeendet in 3 Sekunden..." << endl;
            //return 0;
    
        GetWindowThreadProcessId(hWnd, &procid);
    
        hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);
    
        if(ReadProcessMemory(hproc, (LPCVOID)RamCharname, &buffer, 20, &rw))
        {
            cout << "Charaktername: " << buffer << endl;
            cout << buffer;
        }
        else
        {
            cout << "Datenblock konnte nicht gelesen werden" << endl;
        }
    
        CloseHandle(hproc);//
        Sleep(3000);
        return 0;
    }
    

    Die Ram Adresse ist korrekt, kann mit ArtMoney nachsehen und es bestätigt sich.
    Aber C++ ist so komplex, ich könnte hundert Dinge falsch gemacht haben könnte.
    Eine int Var konnte ich so auslesen, aber bei Chars seh ich immer nur
    meine Fehlermeldung "Datenblock konnte nicht gelesen werden". Hab viel
    gegooglet und herumgetüftelt.
    Danke für Eure Mühe!
    mfg
    Vampir



  • ist denn hproc gültig? also kann der prozess gefunden werden?

    weiterhin, versuchs mal so:

    char buffer[20];
    // ...
    
    ReadProcessMemory(hproc, adresse, buffer, 20, NULL)
    

    Buffer ist ja schon ein zeiger. Wenn das nicht klappt, schau dir den Output von GetLastError an



  • Danke für die Antwort.
    Du hattest recht, hab hproc jetzt so geschrieben:

    if(hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid))
    {
       cout << "hproc ist gültig" << endl;
    }else{
       cout << "hproc ist ungueltig" << endl;
    }
    

    hproc ist ungültig. Kann es sein, dass es nicht geht, weil sich das Programm
    als Dienst tarnt? Hatte nähmlich anfangs auch Probleme das Proggi
    in ArtMoney zu öffnen. Ich will den Ram des Spiels nur lesen, schreiben ist
    nicht wichtig.
    Was könnte ich nun tun?
    Danke für hilfe.
    mfg



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Man könnte versuchen die Doku zu OpenProcess zu lesen:
    http://msdn2.microsoft.com/en-us/library/ms684320.aspx

    Dort könntest Du erfahren das es GetLastError gibt, was Dir sagt warum es nicht klappt.

    Weiterhin könntest Du den interessanten Link lesen, der auch dort steht:
    To open a handle to another another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.

    http://msdn2.microsoft.com/en-us/library/ms717797.aspx



  • Tatsächlich, wie ich vermutet habe: Error Code 5: ERROR_ACCESS_DENIED.
    Aber es muss möglich sein, den Ram dieses Spiels zu lesen, denn es
    gibt andere Programme die dies bereits tun.

    Obwohl ich den 2. Link nicht ganz entschlüsseln konnte, gehe ich davon
    aus, dass ich mit der Funktion AdjustTokenPrivileges(); die Rechte so ändern
    kann, dass ich Access habe? Hab etwas rumprobiert, aber der Spukt nur Errors aus.
    Hier meine Variante:

    AdjustTokenPrivileges(null, false, SE_PRIVILEGE_REMOVED, 20, null, null);
    

    Hier kommt wieder Ihr ins Spiel 🙄

    Ich sags nochmal, ich lerne C++, ich kanns nicht.

    mfg


  • Mod

    vampir26 schrieb:

    Ich sags nochmal, ich lerne C++, ich kanns nicht.

    Du lernst! Genau, deshlab habe ich Dir ja auch alle Infos schon gegeben.
    Als erstes solltest Du lernen die Doku zu lesen. Oder Google zu benutzen.

    In meiner Antwort stand alles drin:

    To open a handle to another another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.

    Die Suche nach AdjustTokenPrivileges und SeDebugPrivilege über Google hätte dich in exakt 0,06 Sekunden ans Ziel gebracht:
    http://support.microsoft.com/kb/131065/en-us



  • Hier, vielleicht hilft dir das auch etwas weiter:

    http://www.skillhackerz.com/Chaotic/Tutorial/Mh1/index.htm



  • Vielen Dank es funktioniert!
    gaylord, dein Link ist sehr gut, sehr einfach zu verstehen.


Anmelden zum Antworten