Speicherbereiche für Variablen extrahieren
-
Moin moin!
Ich würde gern (möglichst) alle Variablen und Konstanten einer Object- oder Executable-Datei mit Namen und Speicherbereich extrahieren. Es wäre zudem super, wenn man noch extrahieren könnte, in welcher Funktion die Variable definiert ist. Die Map-Datei des Linkers konnte mir dabei nicht helfen und auch nm hat nicht das gewünschte Ergebnis produziert.Wie bekommt man das am geschicktesten hin?
LG
Michael
-
michael-h schrieb:
Moin moin!
Ich würde gern (möglichst) alle Variablen und Konstanten einer Object- oder Executable-Datei mit Namen und Speicherbereich extrahieren.Das lässt sich ganz einfach mit Tools wie objdump erledigen.
Es wäre zudem super, wenn man noch extrahieren könnte, in welcher Funktion die Variable definiert ist.
Häh, was? Lokale Variablennamen existieren in einer Objektdatei nicht mehr. Die sind nach dem Compilierschritt verloren. Eventuell kannst du mit genügend Debuginformation irgendwas rekonstruieren, aber sofern der Code auch nur halbwegs optimiert ist, kann man Variablen auch keinen Ort mehr zuweisen, die meisten werden gar nicht mehr existieren.
In der Objektdatei stehen nur Sachen mit externer Linkage, also in der Regel Funktionen und globale (nicht statische) Variablen.
-
Schade. Ich hatte gehofft, dass man das irgendwie bewerkstelligen könnte.
Danke für deine schnelle Antwort.
-
michael-h schrieb:
Schade. Ich hatte gehofft, dass man das irgendwie bewerkstelligen könnte.
Danke für deine schnelle Antwort.Womit sich jetzt die Frage ergibt: Wozu brauchst du das?
(Diese Frage stellt sich immer, wenn jemand etwas unmögliches tun möchte. Denn es deutet da drauf hin, dass derjenige etwas grundlegendes falsch verstanden hat, was korrigiert werden sollte. Bei dir vermutlich etwas mit dem Verständnis, was ein Compiler genau macht oder was ausführbarer Code genau ist)
-
Wenn ich kurz etwas einwerfen dürfte, da es mich einfach interessiert?
Aber es sollte doch möglich sein, trotzdem alle Variablen auszulesen, mit Adresse und Wert...Ich denke da an Programme wie CheatEngine, etc.
Wie realisiert man so etwas?
Meine Idee:
Das DATA-Segment der Executable auslesen, da sind ja Variablen drin !?
Aber wie finde ich das Segment und vor allem, wie extrahiere ich die Variablen?Falls die Zwischenfrage "zu groß" sein sollte, bitte ignorieren...
Danke
-
Du wirst in der Executable keine Variablen finden; die gibt es erst zur Laufzeit, und dann nur noch in der Form, mit der die Maschine umgehen kann - d.h. als Maschinenworte; nirgendwo steht dann mehr geschrieben, dass die 8 Bytes an Speicherstelle 0x12345678 eine Fließkommazahl sind. Was du aus der Executable ziehen kannst, sind Daten, die zur Laufzeit geladen werden - Texte, Bilder, was auch immer man da halt reingestopft hat.
Was CheatEngine angeht, ich kenne das Programm nicht, aber mal so aus dem Stand geraten vermute ich, dass es sich an für Debugger gedachte Schnittstellen wendet, Gerätetreiber benutzt und/oder (unter Windows; da sind Prozesse organisiert wie eine Hippie-Kommune) neue Threads an fremde Prozesse kleistert.
-
CheatEngine und ähnliche arbeiten zur Laufzeit des Programms. Sie brauchen auch keine Informationen über Variablen. Es wird einfach davon ausgegangen, dass an jeder Speicherstelle (des Zielprozesses) ein Wert vom gesuchten Typ steht. Wenn man nun mehrmals die Werte, die man gerade im Spiel sieht, mit den Inhalten des Speichers vergleicht, kriegt man in der Regel genau die Speicherstelle raus, an der dieser Wert liegt.
-
Ein aaaltes Prinzip, nachdem man früher Savegames geknackt hat, um moneycheats und ähnliches zu benutzen...
Spielstand abspeichern, Geldbetrag merken.
Geld ausgeben.
Spielstand abspeichern, Veränderungen per hex-Editor suchen oder alternativ den erwarteten Betrag suchen.
etc.Das selbe macht Cheatengine eben zur Laufzeit und damit lässt sich viel Unfug anstellen. Namhafte Onlinespiele starten bei laufenden Prozessen wie Cheatengine gar nicht. Und es soll Leute geben, die mit Hilfe solcher Programme Spaß bei Java-Browserspielen haben
-
Tobiking2 schrieb:
Es wird einfach davon ausgegangen, dass an jeder Speicherstelle (des Zielprozesses) ein Wert vom gesuchten Typ steht.
Heißt man geht jede Speicheradresse von Anfang bis Ende durch, erhöht sie dann um 1 und geht dann jedes Mal davon aus, es handelt sich um ein 4byte, 8byte Integer/Float ?
-
Ja. Auch wenn man durch eine Analyse von Code zumindest theoretisch feststellen kann, was "Code" und was "Nutzdaten" sind. Aber die simple Methode funktioniert lustigerweise ganz gut.