C++ Pointer mit Offsets benutzen :D



  • hey ich hab im internet ein paar tut gesehen wie man writeprocesmemory benutz aber leider sind dort nie offsets bei dann bringt das ja wenig da es keine pointer gibt und jedes mal wenn das "spiel" zu is das programm umgeschrieben werden muss ich habe solitär jetzt mal genommen und hier die daten

    base pointer :00F32848
    offset1 : 10
    offset2 : 2c
    ich habe gehört das die offsets zu dem base pointer addiert werden müssen nur irg klappt das alles nicht ganz so vllt kann mir ja jemand helfen :))

    hier das hab ich schon

    #include <windows.h> // Hier sind die Funktionen die wir später noch brauchen
    #include <iostream> // Sollte klar sein
    
    using namespace std; // Sollte auch klar sein ...
    
    int main()  // Unsere Main Funktion...
    {
    HWND hwnd; // Unsere Variable die das Fensterhandle speichert.
    hwnd = FindWindow(0,L"Solitär");
    DWORD Id; // Die ID wird in einer Variable des Typ's DWORD gespeichert.
    HANDLE ProcessHandle;
        int value ; 
        DWORD numBytesRead;
        unsigned long address1 = 0x00F32848; 
        unsigned long offset = 0x10; 
        unsigned long address2 ;
    	unsigned long offset2 = 0x2C; 
    
    // Der Fenstertitel vom Solitärfenster ist "Solitär". Das erste Parameter ist der "ClassName" den wir aber getrost ignorieren können. Das zweite Parameter ist unser Fenstername. Das "L" steht für eine Typkonvertierung.. 
    
    if(!hwnd) // Also das Fenster nicht vorhanden ist...
    {
    	cout << "Solitär nicht gefunden!" << endl; // Gebe das aus
    }
    else  // ansonsten...
    {
    	cout << "Solitär gefunden!" << endl; // gebe das aus
            cout << "Fensterhandle: " << hwnd << endl; // Wir können uns das Handle auch nochmal angucken ...
            GetWindowThreadProcessId(hwnd,&Id); // Mit GetWindowThreadProcessId kann man die ID herausfinden. Das erste Parameter ist unser Fensterhandle. Das zweite gibt an, wo die ID gespeichert werden soll.
    
            cout << Id << endl;
    		        ProcessHandle = OpenProcess(PROCESS_VM_WRITE |PROCESS_VM_OPERATION ,false,Id);
    
    	cout << "ProcessHandle: " << ProcessHandle << endl;
    	       cout << "Wie viele Punkte ? "; // Wieviel Punkte sollen geschrieben werden ???
    	cin >> value; // Den Wer übernehmen
    	fflush(stdin);
    
        ReadProcessMemory(ProcessHandle, (LPCVOID)address1, &address2, sizeof(long), &numBytesRead); 
        address2 = address2+offset ; 
    	    address2 = address2+offset2 ; 
    
    	WriteProcessMemory(ProcessHandle,(LPVOID)address2,&value,sizeof(int),NULL);
    }
    
    cin.get(); //Damit sich unser Programm nicht sofort schließt...
    }
    


  • Bist du dir denn sicher, was den Speicherinhalt von Solitär angeht?

    Ansonsten: Du liest Werte, die an der Basis-Adresse stehen. Dann addierst du beide Offsets auf den gelesenen Wert und nutzt das Ergebnis als Zieladresse zum Schreiben. Ist es wirklich da, was du beabsichtigt hast?

    PS: fflush(stdin) solltest du schnell wieder vergessen - und deine Kommentare haben auch keinen wirklichen Informationswert 😃



  • die kommentare sind nicht von mir 😃 hab mir meine code sozusagen zusammengesucht aus mehrern weil keiner den richtigen hatt..

    wenn ich in cheatengine jetzt die addresse von meine punktestand suche und die mit c++ ändere klappt ja auch alles bis ich solitär neustarte da sich bei jedem start die addresse verändert dafür bruach ich ja meine pointer 😃 nur wie bekomm ich die ins programm jetzt so rein das der das als pointer einliest 😃 vllt kann mir das ja jemand zeigen oda erklären 😃



  • ich will in dem script einfach nurnoch die offsets einbinden um auf die addrese zu verweisen für euch pros dürfte das doch kein problem sein ich mein in autoit gehts auch ohne probleme 😃



  • Ich bin mir jetzt nicht sicher ob PROCESS_VM_WRITE auch PROCESS_VM_READ beinhaltet; wenn man dem MSDN Glauben schenkt, dann solltest du das auch noch mit in OpenProcess einfügen (PROCESS_VM_READ | PROCESS_VM_WRITE).

    Entweder war es so gemeint, dass unter base pointer+offset und base pointer+offset2 zwei Pointer sind, die auf deine gewünschte Adresse zeigen, oder der base pointer auf eine Adresse zeigt die dann mit offset bzw. offset2 addiert wird.

    address2 = address2+offset ;
    address2 = address2+offset2 ;
    

    Du adddierst zweimal auf die gleiche Adresse, wobei das erste Ergebnisse quasi einfach überschrieben wird, da ich nicht glaube, dass zwei verschiedene Zahlen auf den base pointer addiert werden müssen, dann hätte man ja auch nur eine Zahl nehmen können; die haben wohl einen anderen Grund.

    Das Wahrscheinlichste ist wohl, dass zwei verschiedene Offsets für bestimmte Zwecke genutzt werden, um die zu bekommen - mit Ansatz der zweiten Methode - wäre folgender Code hilfreich:

    DWORD dwBasePointer = 0xF32848,
          dwOffset = 0,
          dwTargetOffset = 0,
          dwTargetOffset2 = 0;
    ReadProcessMemory( hOpenedProcess, (LPCVOID)dwBasePointer, &dwOffset, 4, NULL );
    dwTargetOffset = dwOffset + 0x10;
    dwTargetOffset2 = dwOffset + 0x2C;
    

    Wo hast du denn die Info her, dass man das addieren soll? Wäre wohl besser, wenn wir das auch sehen könnten.

    Im Übrigen steht DWORD für unsigned long, daher brauchste das nicht unbedingt auszuschreiben 😉

    Du schreibst, dass es mit Autoit geht? Naja, dann ist wahrscheinlich nur das fehlende Recht bei OpenProcess daran Schuld, dass es nicht funktioniert.

    Viel Spaß 🙂


Anmelden zum Antworten