Ahoi.
Als mittelfristiges Ziel für Software möchte ich ein Programm
schreiben, das Informationen aus gerade laufenden
Computerspielen ausliest und evtl. auch wieder (verändert) zurückschreibt.
Ts, ts, ts …
Meine Frage:
Als Erstes brauche ich ja mal die Adresse des
Speicherbereiches, in dem das Spiel läuft. Wie bekomme ich die
heraus?
Die Adressen direkt über Dein Programm abzufragen, ist m.E. ein recht sinnloses Unterfangen. Unter DOS hat es durchaus noch Speichersegmente gegeben, die absolut adressiert wurden, so dass da mehr oder weniger stand „speicher den Inhalt der Variablen so und so unter der Adresse X4711“. In Windows kannst Du das haken. Beim Start sucht sich das Programm einen freien Adressraum im Arbeitsspeicher - der kann bei 4711 oder auch bei 86955 liegen, je nachdem, welche anderen Prozesse gerade wo zugange sind. Das heißt im Klartext, dass die Adressierung nur noch relativ erfolgt. Hinzu kommt, dass während der Laufzeit sowohl ganze Speicherblöcke transferiert werden (wenn es irgendwo zu eng wird) bzw. weitere Speicherbereiche hinzukommen. Im Extremfall wird mit der Zeit der gesamte Arbeitsspeicher zugemüllt und es entstehen Adresskonflikte, was die allseits so beliebten Windows- Abstürze erzeugt. Dein Ansatz von oben ist also für moderne Betriebssysteme nicht brauchbar.
Abzufragen wäre (über den Teilthread des Leitprozesses im System) eine Startadresse, von der ausgehend Du den RAM per relativer Positionierung absuchen müsstest. Spätestens jetzt bist Du aber in der Eieruhr, weil, s.o., die absoluten Adressen der einzelnen Speicherbereiche sich u.U. über den gesamten RAM verteilen. Diesen wiederum (als Dump) auszulesen und zu analysieren, setzt voraus, dass Du das Programm in kompilierter Form vorliegen hast. Mit der kompilierten Version darfst Du dann die Adresspfade nachverfolgen - Echtzeit ist anders, und das ist einer der Gründe, weshalb gute Systemanalytiker zu der immer kleiner werdenden Bevölkerungsschicht gehören, die nicht regelmäßig unter Brücken schlafen.
Werden Daten von Variablen im gleichen Block abgelegt oder sonst irgendwo?
Schlicht : Ja. Wenn die Software nicht von A bis Z in Maschinensprache eingegeben wurde (oder mit der Tastatur aus 0, 1 und Enter *g*), gibt es m.W. keine gesicherte Methode, für einen laufenden Prozess eine reproduzierbare Speicherbelegung zu erreichen. Wenn Du z.B. eine VBA- Funktion, mainzwegen in Excel, programmiert hast, wird diese die benötigten Parameter bei jedem Lauf an einer anderen physikalischen Stelle im RAM verstecken - genau so, wie Du nicht im Voraus sagen kannst, wo sich eine zu speichernde Datei physikalisch auf der Festplatte herumtreiben wird.
Noch ein Aspekt : So lange es immer um den gleichen Computer geht, mag ein Ansatz wie Deiner noch - wenn auch mit extremem Aufwand - implementierbar sein. Eine andere Maschine, mit anderem Prozessor, Grafik-, Soundkarte, Festplatte, Buh und Bäh wird die gleichen Bits, die Du auf Computer 1 noch mit der Pinzette verschieben konntest, ganz woanders verstecken …
Also, ich kann mir nicht vorstellen, dass es funktioniert - lasse mich aber gern eines Besseren belehren.
Gruß kw