Speicheradresse Verändern



  • ja das Tutorial ist wirklich super!

    Habe das ganze mal versucht, aber irgendwie will es nicht so recht klappen.
    Habe zwar die Adresse rausgefunden, in der der entsprechende Wert gespeichert wird, aber wenn ich die Adresse eingebe und dann im Pair dahinter den wert dann tut sich im spiel gar nichts, obwohl das Programm die Sache Ausführt...

    Gruß

    Der Code:

    #include <windows.h>
    #include <tchar.h>
    #include <utility>
    
        // Adressen mit neuen Werten.
    std::pair<::DWORD, int> data[] =
    {
        std::make_pair (0x686614, 999),    // Geld
        //std::make_pair (0x100579c, 321),    // Timer
    };
    const int data_size = sizeof (data) / sizeof (data[0]);
    
    int main (void)
    {
            // MineSweeper suchen und Fenster-Handle sichern.
        ::HWND hwnd = ::FindWindow (NULL, TEXT ("Mafia"));
        if (!::IsWindow (hwnd))
        {
            ::_tprintf (_T ("ERROR: Mafia ist nicht aktiv!\n"));
            return -1;
        }
    
            // Prozess-ID auslesen und ausgeben.
        ::DWORD process_id = 0L;
        ::GetWindowThreadProcessId (hwnd, &process_id);
        ::_tprintf (_T ("INFO : Prozess-ID: %d\n"), process_id);
    
    	        // Zugriff auf den Prozess anfragen.
        ::HANDLE handle = ::OpenProcess (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, false, process_id);
        if (handle == NULL)
        {
            ::_tprintf (_T ("ERROR: Zugriff auf Prozess nicht möglich.\n"));
            return -1;
        }
    
    	        // Alle Änderungen vollziehen.
        for (int i = 0; i < data_size; ++i)
        {
                // Neuen Wert zuweisen.
            if (!::WriteProcessMemory (handle,
                                       reinterpret_cast<void*>(data[i].first),
                                       reinterpret_cast<void*>(&data[i].second),
                                       sizeof (data[i].second),
                                       NULL))
                ::_tprintf (_T ("ERROR: Schreiben in '0x%x' nicht moeglich.\n"), data[i].first);
        }
    
    	        // Nicht vergessen das Handle wieder frei zu geben!
        ::CloseHandle (handle);
        return 0;
    }
    


  • Ev. hast du doch den falschen Wert erwischt. Probier es einfach nochmal ein paar mal.



  • Hm Aber wenn ich im Spiel den Wert minimiere dann zeigt mir TSearch genau diesen Wert auch an, ist also immer Synchron. Naja ich probier noch bisschen rum.



  • Der dargestellte Wert hat selten etwas zu tun mit dem Wert der letztendlich für Berechnungen benutzt wird. Das können getrennte Werte sein, einer mit Offset oder was auch immer.



  • Fellhuhn schrieb:

    Der dargestellte Wert hat selten etwas zu tun mit dem Wert der letztendlich für Berechnungen benutzt wird. Das können getrennte Werte sein, einer mit Offset oder was auch immer.

    Nicht in Minesweeper. 😉



  • Also die Adresse stimmt auf jeden Fall. Ich bekomme immer die gleiche. Habe einfach die Adresse genommen die mir TSearch gefunden hat. Müsst doch gehen oder? Oder muss ich da noch ein paar weitere Werte verändern?

    Beim Autohack Window zb ein paar Werte auf nop stellen.
    Kenne mich da allerdings nicht so aus...



  • so bin jetzt mal ins Autohack von TSearch rein und hab geschaut was er macht wenn ich geld ausgebe oder bekomme. Habe beide gefreezt und dann das Programm gestartet et voila: Ich habe 9999 dollar 😉 und das tolle ist, dass diese sich nicht verändern wenn ich etwas ausgebe etc.

    Aber: Wie kann ich es jetzt in das Programm einbauen, dass ich nicht immer mit Tsearch hantieren muss?
    Überall wo mir unten 90 Angezeigt wird die Adressen in das Array einbauen und diese Werte so wie es Tsearch Zeigt mir 90 versehen? wohl kaum.

    meinungen?



  • Wenn sie sich nicht verändern heißt dies, das das Programm (TSearch?) diese durchweg auf dem Wert hält und diese nicht nur einmal reinschreibt. Liegt da der Haken?



  • Also habe geschaut welche Adressen auf 90,also no operation gesetzt werden wenn ich das einschalte und habe diese Adressen einfach mal in meinem Programm so gesetzt. Allerdings schmiert mir bei Programmstart jetzt mein eigentliches Game ab... komisch eigentlich weils ja über Tsearch geht.

    std::pair<::DWORD, int> data[] =
    {
    	std::make_pair (0x686614, 999),    // Geld
    	std::make_pair (0x44FA8D, 90),    // Geld
    	std::make_pair (0x44FA8E, 90),    // Geld
    
    	std::make_pair (0x45A9B8, 90),    // Geld
    	std::make_pair (0x45A9B9, 90),    // Geld
    	std::make_pair (0x45A9BA, 90),    // Geld
    	std::make_pair (0x45A9BB, 90),    // Geld
    	std::make_pair (0x45A9BC, 90),    // Geld
    	std::make_pair (0x45A9BD, 90),    // Geld
    
    };
    


  • Falls die "90" ein NOP sein soll, dann muß sie hexadezimal (0x90) geschrieben werden und WriteProcessMemory () darf da nur ein einziges Byte schreiben (also kein sizeof(sonstwas)).



  • Tatsache! Funktioniert einwandfrei!
    Aber warum muss das nur ein Byte also 8 bit groß sein?

    PS: Merkwürdig auch dass ich bestimmte Wert mit Tsearch einfach nicht finden kann!!! zB mein Leben. Unauffindbar egal welchen Wertebereich ich durchsuche...



  • Ein Byte, weil "NOP" eben ein x86-Assembler-Befehl mit einem Byte ist.
    Befehle "auszunoppen" ist aber eher schon etwas fortgeschrittenes cheaten/hacken, da sollte man schon ein wenig davon verstehen was man macht.

    Was "das Leben" angeht... die werden normalerweise, und wenn das Spiel nicht versucht sich gegen Cheater zu schützen, null-basiert oder eins-basiert abgespeichert. D.h. "2 Leben" kann als 1 oder 2 abgespeichert sein.
    Und nicht jeder Wert muss ein DWORD sein. Wenn das Spiel die "Anzahl der Leben" als char speichert (was leicht möglich ist, man wird ja kaum mehr als 255 Leben brauchen), dann viel Spass beim Suchen. Denn du wirst vermutlich etliche Bytes finden die den passenden Wert haben.



  • OK vielen Dank für die Hilfe.

    Das heißt wenn ich hundert leben habe dann kann es sein dass sie als 50 gespeichert werden?



  • Such die "Hundert Leben 😮 " mal nicht als Integer (0x00000064), sondern als Float (0x42C80000).
    (Genaueres bei wikipedia (o.ä) : Binäre Darstellung von Fließkommazahlen)) 😋



  • Jo hab alles schon mal versucht, könnte allerdings wirklich sein dass sie als char gespeichert werden...

    aber das mit dem "ausnoppen" geht wirklich einwandfrei. Was sich da noch so alles anstellen lässt... 😉 evtl. durch Wände gehen?



  • gut, also die Leben kann ich wohl nicht beeinflussen...
    komisch, denn es gibt im netz trainer die die leben freezen können und funktioniert bei mir auch wunderbar. würde mich interessieren wie die die adressen rausbekommen haben...



  • Dieser Thread wurde von Moderator/in Phoemuex 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.



  • derDoc schrieb:

    gut, also die Leben kann ich wohl nicht beeinflussen...
    komisch, denn es gibt im netz trainer die die leben freezen können und funktioniert bei mir auch wunderbar. würde mich interessieren wie die die adressen rausbekommen haben...

    Vielleicht gibt es Leute die nicht bloss fertige Tools sondern auch Disassembler bedienen können... 🙄


Anmelden zum Antworten