ReadProcessMemory veraendert den Wert einer anderen Variable



  • Hallo liebe C++ Community,

    ich stehe da vor einem seltsamen Problem und weiss mir einfach nicht mehr zu helfen. Etwaige Google-Suchen konnten mir nicht helfen, daher hab ich jetzt den Entschluss gezogen einmal nachzufragen.

    Kurz noch zu mir, ich bin ein sehr unerfahrener, mehr oder weniger, Trial and Error Programmierer. Habe nachdem ich die ersten 20 Probleme auf projecteuler geloest hatte mal mit einem 'groesseren' Projekt angefangen. Um genau zu sein ein Trainer fuer ein Spiel. Mich hat einfach schon immer interessiert wie das funktioniert. 😉

    Zu dem Problem:
    Kurz zum Aufbau des Projektes, habe ich zum einen nur meine main.cpp mit all erdenklichem code. Zusaetzlich habe ich mir ein Headerfile erstellt in welchem ich alle, fuer die Cheats relevanten, Daten speicher (bspw. Adresse des Cheats, Groesse des Cheats (Bytes), der eigentliche Cheat ansich, etc.). Das habe ich gemacht damit ich nur im Headerfile rumfuschen muss um es evtl. fuer andere Spiele anzupassen.

    Ansich funktioniert alles wunderbar, worauf man dann ja immer schon recht Stolz ist, allerdings hat sich ein kleiner Bug eingeschlichen.
    Der Trainer besitzt insgesamt 8 Cheats. Wenn ich nun den Cheat 8 aktiviere, aendert dieser den Wert der Adresse des 5. Cheats.

    Ich bin der Ursache des Problems schon auf den Grund gegangen, nachdem folgender Code ausgefuehrt wird:

    ReadProcessMemory(pHandle, (LPVOID)cheat8Address2, &cheat8Old2, cheat8BytesToOverwrite2, NULL);
    

    Wird der Wert von,

    DWORD cheat5Address;
    

    (die Variable wurde im Headerfile deklariert) geaendert. Der Wert betraegt jedes mal, 0x3d0c bzw. 15628 dezimal.

    Die Variable konstant zu machen ist leider keine Moeglichkeit da die Adressen berechnet werden. Ich kann natuerlich auch nicht sagen ob noch mehr derartiger Probleme auftauchen, beim durchtesten ist mir aber nur dieser eine aufgefallen.

    Falls ihr weitere Informationen benoetigt stehe ich euch gern zur Verfuegung.

    Vielleicht noch wichtig, ich nutze das Visual Studio 2013.

    Ich bedanke mich im Voraus fuer eure Hilfe.

    Liebe Gruesse

    locke



  • Das deutet auf einen Speicherüberschreiber hin.
    Hast du mal den Wert von 'cheat8BytesToOverwrite2' überprüft, ob der auch wirklich stimmt, d.h. zu der Größe (in Bytes) von 'cheat8Old2' paßt?

    Zeig' mal am besten dessen Deklarationen.



  • Huhu Th69,

    besten Dank fuer deine Antwort.
    Ja an einen Speicherueberschreiber habe ich auch schon gedacht. 😃

    Nochmals zur Uebersicht folgender Code:

    ReadProcessMemory(pHandle, (LPVOID)cheat8Address2, &cheat8Old2, cheat8BytesToOverwrite2, NULL);
    

    Zu den Deklarationen:
    im Headerfile

    DWORD cheat5Address;
    
    DWORD cheat8Address2;
    char *cheat8Old2;
    DWORD cheat8BytesToOverwrite2 = 0x8;
    

    Ich hab das mit dem Cheat 8 eben nochmals durchgespielt, dieser erhaelt die korrekten Werte und funktioniert einwandfrei. Beim deaktivieren spielt er auch die exakten Bytes wieder zurueck.

    Liebe Gruesse

    locke

    edit
    Vielleicht auch ganz interessant, ich hatte zum Spass mal einfach im Code gesagt

    cheat5AddressBackup = cheat5Address
    

    und dann mit dem Backup weitergearbeitet. Das fuktioniert dann tadellos, ist aber ja irgendwie nicht Sinn und Zweck der Sache.



  • Du schreibst in einen char-Zeiger. Bist du sicher, dass dieser auch so groß ist, wie cheat8BytesToOverwrite2 angibt, denn nur, wenn du für 64-Bit Windows baust, sind Zeiger auch 8 Bytes groß.



  • Hmmm, ich waere davon ausgegangen das er sich da, je nach Input, anpasst.

    Ich habe jetzt zum testen mal ein,

    char *cheat8Old2[2];
    

    gesetzt und schon scheint das Problem verschwunden.
    Damit das nicht nochmals passiert auch gleich die anderen char Pointer auch dementsprechend deklarieren.

    War das jetzt tatsaechlich des Raetsels Loesung?
    Waere ja ziemlich einfach (und irgendwie peinlich 😃 ).

    Wenn dem so sei dann besten Dank fuer die Hinweise. Auch gut zu wissen das ein Char-Pointer unter 64bit eine Groesse von 8 byte hat.

    Liebe Gruesse

    locke



  • Na du musst dir da ziemlich bewusst sein, warum du ein Array von Zeigern auf chars haben möchtest.



  • Kennst du noch nicht das Schlüsselwort 'sizeof'?

    DWORD cheat8Address2;
    char *cheat8Old2;
    DWORD cheat8BytesToOverwrite2 = sizeof(cheat8Old2);
    

    Mir kommt es aber komisch vor, daß die Cheats aus Zeigern bestehen sollen (und nicht aus direkten Werten) 😕
    Warum mußt du überhaupt erst vorher die Werte auslesen - Cheats werden üblicherweise ja einfach mittels WriteProcessMemory(...) gesetzt?

    PS: Und gerade bei Zeigern aus einem anderen Prozess mußt du dir über die Unterschiede bzgl. 32 und 64 Bit im Klaren sein (d.h. beide Prozesse sollten dann dieselbe Bittigkeit aufweisen).


Anmelden zum Antworten