EXE nachträglich ändern



  • Guten Abend zusammen,
    Was Ich fragen wollte, ist, ob man einen String nachträglich in einer EXE
    verändern kann. Dass es mit einem Hex Editor geht, das weiß ich, das habe ich schon selber getestet. Aber Ich möchte diesen String mit einem 2. Programm ändern.

    Die Methoden mit Registry oder einer extra Datei, will ich nicht benutzen.
    Der Wert muss nur einmal geändert werden.

    Ein Beispiel:
    In das Programm A gibt man z.b. das Wort "Hallo" ein.
    Anschließend wird der String "Hallo" in das Programm B geschrieben, bzw
    der alte Wert im Programm B überschrieben.

    Wenn man jetzt Programm B ausführt, dann erscheint auf dem Bildschirm
    "Hallo".

    In diesem Programm will Ich den Wert ändern:

    #include <iostream>
    #include <string>
    #include <stdio.h>
    using namespace std;
    
    string hallo="kk";      //das ist der Startwert, 
                            //der nachher überschrieben werden soll
    
    main ()
    {
        cout <<hallo <<"|" <<endl;
        system("pause");
        return 0;
    }
    

    mfg
    Dr.ChAoS



  • Eine Möglichkeit wäre es, die .EXE mit einem fstream zu öffnen, den String dort zu suchen und ihn dann zu ersetzen (wenn du den Offset kennst, an dem er steht, entfällt das Suchen) - aber dabei solltest du darauf achten, daß du keine wichtigen Bestandteile deines Programms zerstörst (d.h. der Ersatzstring darf nicht länger sein als der ursprüngliche). Aber einfacher ist es vermutlich, wenn du deinen Quelltext änderst und neu compilierst 😉



  • Ich würd den String in eine Ressource-Datei packen, dann muss man nur neu linken, nachdem die Datei verändert wurde 🙂



  • Vorallem, wenn der String größer ist, als vorgesehen, also wenn du 250 Bytes für den String reserviert hast und einen 251 byte größen sting hineinschreiben willst könntest du das Datensegment Zerstören.

    Und wenn du den String einfach größer machst, also das Datensegment verschiebst, stimmen die Offsets nicht mehr !



  • Hilft dir das hier weiter?

    http://www.angusj.com/resourcehacker/



  • Ja ich habe das offset, aber wie schreibe ich dann genau an die stelle des offsets?

    Die Idee mit dem neucompilieren ist nicht so gut, da ich für das programm zum ersten keinen compiler oder andere extra Programme vorraussetzten möchte und zum zweiten nicht möchte dass jemand den Quelltext sieht. Außerdem soll es ja automatisch ablaufen.
    mfg
    Dr.ChAoS



  • Warum holst du dir den String nicht einfach als Programmeingabe über cin?



  • Weil Ich den string nur einmal ändern will und der soll dann IMMER so bleiben.
    Also auch nach dem programm neustart.
    mfg



  • Oder es ginge auch anders, wenn das ganze wirklich nur einmal geändert werden soll, dann übergib es als Argument an main (main kann zwei Argumente haben, s. hier http://www.it-academy.cc/menu/80/C++.html und dann dem Link "Standard-Parameter der Funktion main()" folgen).
    Erstelle dann eine Batch-Datei über die das eigentliche Programm aufgerufen werden soll. In der Batch Datei übergibst du den String als Argument, damit brauchst du die Batch datei auch nur einmal verändern, wenn der String nachträglich nicht mehr verändert werden soll.



  • Ne, das ist auch nicht das was ich will, es soll eine standalone exe werden, ohne
    zusätzliche Dateien oder ähnlichem.
    Die Idee mit dem Offset ist super, aber wie schreibe ich genau an die Stelle eines offsets?
    mfg



  • Indem du einen fstream auf diese Datei öffnest, an das Offset seek-st und dann den String schreibst. Allerdings würde ich an deiner Stelle dann nicht std::string sondern ein char-Array verwenden.



  • ok danke, ich weiß zwar noch nicht was seek-st ist^^ aber ich versuche es mal
    gn8
    mfg
    Dr.ChAoS

    //edit: ok jetzt weiß ich was seek ist.


Log in to reply