Zustand einer Variablen während der Laufzeit verändern

  • Allgemein

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von rwCapt.

    Zustand einer Variablen während der Laufzeit verändern

    Guten Abend,

    der Titel bedarf etwas Erläuterung. Ich habe ein Spiel, das ich nicht selbst erstellt habe. Dieses Spiel erlaubt es einem leider nicht, während der "Sitzung" eine bestimmte Eigenschaft zu verändern, die ich so gerne verändert haben möchte. Theoretisch müsste es sich nur um eine Zahl handeln, die zu verändern ist.
    Diese Einstellung lässt sich vor dem Start des Spiels durchführen, vielleicht müsste man hier mal schauen, wo diese Einstellung im Arbeitsspeicher in dem Moment hinterlegt wird, um sie dann während der Sitzung verändern zu können.

    Weiß jemand, wie man das angehen kann? Meine Idee wäre es, den Arbeitsspeicher zu überwachen. Kann ein externes Programm herausfinden, wo ein anderes gerade Dinge im Arbeitsspeicher verändert hat?
    CheatEngine ist gut dafür. Wenn das nur einmal eingestellt werden kann, wird es sehr wahrscheinlich schwer das zu finden. Weil du musst erstmal eine Speicheradrese finden wo der Wert drin ist, das macht man, indem man den Speicher nach dem Wert scannt scannt, bei Wertänderung wieder scannt, dann noch die Sache mit den BasePointer den du finden musst. Wenn du allerdings alles findest BasePointer/Offset(s) kannste auch mit VB im Ram editieren.

    Ich denke mit ollydbg, IDA oder Ghidra sind die Chancen besser, aber wenn dir diese Tools nichts sagen, wirste damit nichts anfangen können.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Takafusa“ ()

    @rwCapt Wenn Du das Spiel selbst programmiert hast, solltest Du wissen, von wo aus lesend und schreibend auf die Variable zugegriffen wird.
    Wenn Du willst, dass beim Lesen und / oder Schreiben einer Variable noch etwas anderes passieren soll, mach da eine Property draus, die hat einen Getter und einen Setter, da kannst Du reinschreiben, was noch zu passieren hat:

    VB.NET-Quellcode

    1. Private _MyValue As Integer
    2. Public Property MyValue() As Integer
    3. Get
    4. ' Etwas anderes beim Auslesen tun
    5. Return _MyValue
    6. End Get
    7. Set(ByVal value As Integer)
    8. ' etwas anderes beim Zuweisen tun
    9. _MyValue = value
    10. End Set
    11. End Property
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    rwCapt schrieb:

    Ich habe ein Spiel, das ich nicht selbst erstellt habe.

    RodFromGermany schrieb:

    Wenn Du das Spiel selbst programmiert hast, solltest Du wissen
    :huh:
    Da hast Du wohl das »nicht« in Post#1 überlesen …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Da hast Du wohl das »nicht« in Post#1 überlesen …
    :whistling:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Alles gut, kann passieren. Trotzdem danke ^^

    CheatEngine kenne ich tatsächlich bereits, nur bin ich mit der Bedienung noch nicht ganz vertraut. Durch Ghidra habe ich das Programm auch mal durchlaufen lassen, ebenso einmal in IDA Free.
    Ich könnte ja jetzt versuchen, herauszufinden, ob ich irgendwo im Assembler-Code Hinweise auf meine Gesuchte Einstellung finde.

    Eine Frage noch schnell zum BasePointer: So wie ich das jetzt gesehen habe, arbeitet man in Assembler selbst mit festen relativen Adressen. Das Betriebssystem organisiert halt eine Base-Adress, die addiert mit den Relativen theoretisch die absolute Adresse ergeben sollte.
    Jetzt gibt es noch das Gedöhns mit den Reallocations ^^
    Was zeigt CheatEngine da an? Ist es der virtuelle Arbeitsspeicher oder der "echte"? Im echten wird ja meines Wissens nach sehr viel geschoben. Programmteile werden in einzelne Blöcke unterteilt und nach Auslastung und so wie es passt irgendwo hin verschoben und "gequetscht" ;)

    Passiert das im virtuellen Arbeitsspeicher auch? Oder wird da sämtliche Assemblercode linear und zusammenhängend gespeichert?