Home of Gamehacking - Archiv

Normale Version: Crysis 2
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Ja da hast du allerdings recht, wie komme ich denn sonst an die Base Adresse?
Garnicht! Die sind auf dem Stack gesichert und werden dynamisch abgefragt. Codecave ist hier das sinnvollste und führt am schnellsten zum Ziel.
Was meinst du mit Stack?
Ok dann werde ich mir mal paar tut zu Gemüt tun.
Stack, auf gut Deutsch, Stapel.
Der Stack ist ein bestimmter Speicherbereich der teilweise auch schon in der Hardware von Prozessoren integriert ist. Viele Sachen, Daten bzw. Objekte laufen über den Stack. Das beste Beispiel ist die Sache mit den "Call's". Wir alle kennen sie, aber hat sich mal einer ne Platte gemacht woher das Programm bzw. der Prozessor weiß wohin er/es zurückspringen soll?
Bei einem Jump ist das einfach... Wird von einer Adresse des Programms zu einer anderen gesprungen muss natürlich auch ein Sprung wieder zurück erfolgen. Bei einem Call sieht das anders aus. Am Ende eines Call's steht immer ein "RET". Also woher weiß der Prozessor jetzt wohin er jetzt zurückspringen soll? Ganz einfach... Wird ein Call aufgerufen wird die Rücksprungadresse auf den Stack gesichert. Ist der Prozessor am ende des Calls, also wieder am RET, angelangt wird die Rücksprungadresse wieder vom Stack abgerufen.

Noch ein Beispiel...
Um diverse Registerzustände zu sichern nutzt man entweder den PUSH Befehl direkt, oder man nutzt den PUSHAD Befehl. Mit diesem werden sämtliche Register auf den Stack gesichert. Da man Objekte auch nur oben auf den Stapel ablegen kann müssen diese auch wieder in umgekehrter Reihenfolge vom Stack geholt werden.
Hey,
im Zusammenhang mit dem PUSHAD-Befehl sei dir von mir auch der PUSHFD-Befehl ans Herz gelegt. Bei einer Codecave vergleicht man oft gewisse Werte mit einander (z.B cmp [eax+4], 1), dadurch werden jedoch die sogenannten Flags mit geändert. Wenn man jetzt aus der Codecave zurückspringt und nicht die Flags vorher gespeichert hat, kann es zu unvorhergesehenen Reaktionen des Spiels/Programms kommen, da wie schon gesagt die Flags nicht mehr so sind wie sie sein sollten.
Das kann allerdings nicht passieren wenn man aufpasst wo man seinen Sprung zur Codecave macht. Wenn man seinen Sprung innerhalb einer CMP und TEST Routine macht, sollte sich im Klaren sein was dann passiert. Und da wird auf jeden Fall etwas unvorhergesehenes passieren, villeicht noch nicht mal auf jenem System wo die Codecave bzw. der Trainer geschrieben wurde, aber vielleicht bei einem anderen User.

Wenn möglich dann nehme ich Adressen welche "ungefährlich" sind. Meißtens mache ich es auch so, das ich z.b. solche CMP und TEST's oder bedingte Sprünge mit in die Codecave nehme, aber das kommt ganz drauf an. Bis jetzt musste ich noch nie die kompletten Flag-Register mitsichern, da ich bis jetzt auch noch kein Spiel gesehen habe welches z.b. einen CMP ausführt und nach z.b. 50 Zeilen Code erst entscheidet was passieren soll.

Aber im eigentlichen brauchste noch nichtmal das ganze EFlag Register sichern. Da reicht es schon zu wenn Du nur das Flag-Register sicherst. Realisieren tust Du das mit dem Befehl PUSHF.
Seiten: 1 2