Informationen aus Spielen auslesen

Von: , Frage gestellt am So, 30. Jan 2005

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

4 Antworten zu dieser Frage

  1. Antwort von nach einem Tag 0 hilfreich
    Re: Informationen aus Spielen auslesen

    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]

    • Antwort von nach 2 Tagen 0 hilfreich
      Re^2: Informationen aus Spielen auslesen

      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

  2. Antwort von nach einem Tag 0 hilfreich
    Re: Informationen aus Spielen auslesen

    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

    • Antwort von nach 2 Tagen 0 hilfreich
      Re^2: Informationen aus Spielen auslesen

      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

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!