exe temporär "patchen"

  • Guten Morgen miteinander.
    Ich habe mal wieder eine Frage: Ist es möglich, Texte in der .data-Sektion einer exe temporär zu ändern(möglichst mit AutoIt)?

    Das Problem: Ich habe hier eine exe, welche in der .data-Sektion zwei Pfade zu Dateien stehe hat, welche sie einlesen soll. Nun befinden sich die Dateien "sinnigerweise" an unterschiedlichen Orten.

    Mit einem Debugger bzw. eine Hexeditor kann man die Pfade problemlos umschreiben, sodass die exe bei mir nun die Dateien in dem Verzeichnis sucht, wo auch die exe ist.

    Jetzt würde mich interessieren, ob man einen Loader basteln kann, der diese Änderung temporär übernimmt.
    Sprich: Loader starten->dieser startet die exe und ändert dann den RAM.

    Ein Patch der das für immer abändert könnte ich problemlos schreiben, aber das ist nicht das Ziel.

    Ich habe es bereits per Nomad.au3 probiert.
    Allerdings liefert die mir einen Wert zurück, der mit dem Wert aus dem Debugger mal gar nichts zu tun hat.

    Jetzt gibt es für mich diese Probleme:

    • Die .data-Sektion landet doch auch im RAM, oder nicht?
    • Wenn ja: Laut verschiedenen Internetseiten ist die .data-Sektion auf jeden Fall lesbar. Also wie komme ich an die Strings?
    • Geht das überhaupt mit AutoIt?
  • Ja,
    du kannst natürlich Texte in einer ausführbaren Datei ändern, das ist auch mit AutoIt überhaupt kein Problem.
    Das Problem, die Texte in der EXE direkt zu ändern besteht darin, daß du nur mit gleich langen oder kürzeren Texten ersetzen kannst. Bei z.B. Pfaden sollte man das beachten!
    Ob du den Pfad im Ram änderst oder direkt in der Datei, bleibt gleich. Datei ändern ist wesentlich einfacher.
    Das ändern im Ram ist dann genauso einfach möglich, wenn du die Einsprungpunkte (Adressen) kennst. Um mehr zu erfahren, solltest du dich mit dem PE-Format (http://www.microsoft.com/whdc/system/pl…are/PECOFF.mspx) auseinandersetzen. Dort ist das Format erklärt, für eine Anwendung in AutoIt solltest du im engl. Forum nach "Subrogation" suchen.

    Ich verstehe nicht was du mit Nomad vorhast, die 08/15 Stringbefehle von Autoit reichen doch vollkommen aus um deinen gesuchten String im Ram zu finden und abzuändern?

  • Wie gesagt, eine Datei für immer zu ändern, stellt für mich kein Problem dar.
    Mir geht es halt darum, dass ich das auch gerne mit AutoIt temporär machen würde, deshalb die RAM-Änderung.

    Nomad nutzte ich nur, weil das bisher die Standard-Variante für mich war. Aber da ging es eher um Werte(Leben, Schuss...).

    Ich nehme an, Du würdest es eher über _WinAPI_WriteProcessMemory() machen? Oder was meinst Du mit 08/15-Befehle?
    StringBetween und so weiter? Wie käme ich dafür an den RAM?

  • Ok, Provblem teilweise gelöst.
    Ich kann die Strings nun mit der Nomad.au3 auslesen und auch ändern.
    Allerdings werden die Strings nur ein Mal bei Programm-Start eingelesen und mein Script scheint zu langsam zu sein.
    Zumindest sagen mir Debug-Nachrichten und Cheat Engine, dass meine Werte eingetragen wurden.

    Das heißt, ich müsste das Programm starten, sofort pausieren, Änderungen vornehmen und dass das Programm weiterlaufen lassen.
    Ich nehme allerdings an, dass das so nicht möglich ist!?

  • Sinnvoll ist Ansichtssache, aber ich erkläre gerne, worum es mir geht:
    Es handelt sich um ein Spiel, welches 2 Dateien beim Start einliest:

    • Konfigurationsdatei(Vollbild, Steuerung, Auflösung, Schattendetail,...).
    • Mod-Liste: Enthält Mods, die geladen werden sollen.

    Nun gibt es Leute, die haben das Spiel mehrfach installiert, mit verschiedenen Konfigurationen und Mod-Listen.

    Auf welche Dateien zugegriffen werden soll, steht in der .data-Sektion und kann dort auch problemlos geändert werden.
    Das hat den Vorteil, dass man nicht immer die Dateien umbenennen/kopieren muss. Einfach die exe starten und diese greift auf die richtigen Dateien zu.

    C:\Installation1\Programm.exe: Einlesen der Dateien C:\sonstiges\Config.txt und C:\sonstiges\Mods.txt
    C:\Installation2\Programm.exe: Einlesen der Dateien C:\sonstiges\Config1.txt und C:\sonstiges\Mods1.txt

    Die exe patchen war kein Problem. Mir ging es nur darum, ob ich das auch noch irgendwie im RAM hin bekäme, denn dann könnte der Benutzer selbst definieren(z.B. per ini-Datei), auf welche Dateien die exe zugreift.

    Und danke für den Link, den habe ich gestern abend auch gefunden.

  • Wenn das Patchen der EXE kein Problem ist, wieso machst du dann kein Auswahlmenü rein?
    Das sind nur einige Zeilen Code, die du an das Ende der EXE anhängen müsstest, 1x Sprungadressen umbiegen, fertig. Seit es dieses Dateiformat gibt, wird das so gemacht....
    Mal abgesehen von der schon von Pee angesprochenen Sinnhaftigkeit eine EXE zu patchen (was glaubst du wie lange die Spielehersteller das erlauben werden?) ist das Thema "AutoIt" hier völlig aussen vor. Vote for close....