Informationen aus Spielen auslesen

Hi,

ich bin ganz fit in VBA und steige gerade auf VB.NET um. 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.

Meine Frage:
Als Erstes brauche ich ja mal die Adresse des Speicherbereiches, in dem das Spiel läuft. Wie bekomme ich die heraus? Werden Daten von Variablen im gleichen Block abgelegt oder sonst irgendwo?

Danke für eure Hilfe.
Martin

Hi Martin,

mit dem Wissen ueber den Speicherbereich in dem ein Programm laeuft ist es nicht allein getan, abgesehen davon das der sich staendig veraendert. Auserdem sind die Speicherbereiche der Programme zudem untereinander geschuetzt.
Es ist also nicht so ohne weiteres moeglich einfach auf eine Speicherzelle eines Programms zuzugreifen, das nicht im gleichen Adessraum laeuft. Abgesehen davon muesste man auch noch die Interpretation des Inhaltes der Speicherzelle wissen… steht da jetzt ein INT oder CHAR oder eine Sprungadresse oder ein Befehl oder…!!

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

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

Hi O…,

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 …

Nicht was DU schon wieder denkst!
Ich habe nämlich ein Faible für den FS 2002 und finde, das der Autopilot ein bisserl schwach auf der Brust ist. Und das möchte ich ändern. U.A.

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.

Und man kann diese Zeiger auf die Variablen nicht abgreifen? Aber wahrscheinlich braucht man dazu den Quellcode.

Also für die sich im Speicher befindlichen Programme kann man den zugehörigen Speicherbereich abrufen. Das habe ich bei einem Cheattool schon mal gesehen…

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.

Das kann og. Tool auch, also geht es prinzipiell.

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.

Schaunmermal… Ich glaub sowas ja immer erst wenn ich’s selber seh’.

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.

Danke für die Motivierung! ;o)

Martin

Hi Peter,

mit dem Wissen ueber den Speicherbereich in dem ein Programm
laeuft ist es nicht allein getan, abgesehen davon das der
sich staendig veraendert. Auserdem sind die Speicherbereiche
der Programme zudem untereinander geschuetzt.
Es ist also nicht so ohne weiteres moeglich einfach auf eine
Speicherzelle eines Programms zuzugreifen, das nicht im
gleichen Adessraum laeuft.

DAS wäre natürlich schlecht! Aber wie macht das denn das Cheattool das ich habe (s. mein anderes Posting)?

Martin