TextFile in exe einfügen



  • ich möchte so eine art logfile für mein programm machen..
    ich will aber nicht, dass jeder die logdatei ändern/anschauen kann..
    kann ich so ein "Text-File" in die exe einfügen oder gibt es andere möglichkeiten?



  • Hallo

    binär und/oder verschlüsselt speichern.

    bis bald
    akari



  • Ich denke mal, dass er sich den Part schon denken kann... aber wie ändert man eine Exe-Datei, dass sie hinterher noch ausführbar ist und der Text darin keine Fehler verursacht? - Dieser Part würde mich allerdings auch interessieren.



  • Hallo

    1. Um eine Exe nachträglich zu ändern, müßte man genau über den Aufbau einer solchen Bescheid wissen (ASM) und dann noch alle Sprungbefehle auf die neuen Adressen ändern. Eine sehr aufwendige und komplizierte Sache.

    2. Kann eine Exe nicht geändert werden, wenn diese ausgeführt wird!

    bis bald
    akari



  • akari schrieb:

    1. Um eine Exe nachträglich zu ändern, müßte man genau über den Aufbau einer solchen Bescheid wissen (ASM) und dann noch alle Sprungbefehle auf die neuen Adressen ändern. Eine sehr aufwendige und komplizierte Sache.

    Dazu gibt es auch schon genügend Community.

    2. Kann eine Exe nicht geändert werden, wenn diese ausgeführt wird!

    Das stimmt nicht. Ich habe eine Exe geschrieben, die sich selbst löschen kann... man muss die Exe nur in den Speicher legen, wobei ich beim BCB das Gefühl habe, dass er es automatisch macht... weil damit hab ich das ja gemacht...

    - Windoof



  • Hallo

    Das stimmt nicht. Ich habe eine Exe geschrieben, die sich selbst löschen kann... man muss die Exe nur in den Speicher legen, wobei ich beim BCB das Gefühl habe, dass er es automatisch macht... weil damit hab ich das ja gemacht...

    Und wie macht man das? Ich habe ein neues Projekt erstellt, in dem einfach nach dem Application->Run() dies eingefügt habe

    if (DeleteFile(Application->ExeName) != true)
      MessageBox(0, Application->ExeName.c_str(), "SelfDelete failed", MB_OK);
    

    was die MessageBox auslöst (wie ich erwartet habe)

    bis bald
    akari



  • Ich habe vor Jahren mal etwas ähnliches gemacht, und zwar habe ich hinter die Exe-Datei eine Prüfsumme gehängt, um festzustellen, ob die Exe verändert wurde.
    Dazu habe ich die Exedatei eingelesen, die Prüfsumme gebildet und dann dahinter abgelegt. Das hat ohne Probleme geklappt.

    Ich würde es so machen:
    Lege eine Variable an, in der die Größe der Exe abgelegt werden soll. Initialisiere diese erstmal mit 0. Programm compilieren.
    Nach dem Compilieren die genaue Größe der Exe ermitteln und in diese Variable eintragen. Anschließend neu compilieren, die Größe der Exe dürfte sich dabei nicht verändern (es ist ja nur ein Wert verändert worden und kein neuer Code hinzugekommen).

    Beim Loggen: Immer die gesamte Datei einlesen (z.B. in einen Stream) und die Logdaten dahinter schreiben und dann den gesamten Stream speichern.

    Zum Auslesen der Logdatei könntest du dein Programm so gestalten, das es mit Hilfe eines versteckten Menüpunktes oder auch einer Kommandozeilenoption die Logdaten ausgibt, in eine Datei schreibst, usw. Der Anfang der Logdaten ist dir ja bekannt (s.o.).

    Vielleicht kann dies dir helfen.



  • akari schrieb:

    Hallo

    [...]
    Und wie macht man das? Ich habe ein neues Projekt erstellt, in dem einfach nach dem Application->Run() dies eingefügt habe

    if (DeleteFile(Application->ExeName) != true)
      MessageBox(0, Application->ExeName.c_str(), "SelfDelete failed", MB_OK);
    

    was die MessageBox auslöst (wie ich erwartet habe)

    Ich weiß es nicht, vielleicht hab ich etwas in den Projekteinstellungen verändert, keine Ahnung, habe es danach auch nie wieder probiert, auf jeden Fall weiß ich, dass es geklappt hat, schließlich war die Datei danach weg 😉

    - Windoof



  • Hallo

    @Windoof : also ich finde da keine Einstellung.

    @Burkhi : klingt ja schon nicht schlecht, aber auch du mußt erklären, wie du auf eine geöffnete Datei schreibend zugreifst.
    Ich schaffe es jedenfalls nicht :

    // Standard-C++ :
    ofstream FStream(Application->ExeName.c_str(), ios_base::out + ios_base::app);
    assert(FStream.is_open()); // assertion, weil stream nicht geöffnet
    FStream << "Hallo";
    
    // BCB-Variante
    TFileStream *FileStream;
    FileStream = new TFileStream(Application->ExeName, fmOpenWrite); // Exception
    delete FileStream;
    

    bis bald
    akari



  • Das ist richtig, die ExeDatei kannst du nicht zum schreiben öffnen. Aber zum Lesen, da geht es. Und geöffnete Dateien kann man auch umbennen. Also behelf ich mir hier mit einen Trick.:
    Ich benenne die usprüngliche Datei um, erstelle eine neue, kopiere den Inhalt der Alten dort hinein, schreibe dahinter, was ich brauche, und benenne die neue Datei anschließend wieder zurück.

    Hier ein kleines Beispiel:

    String oldname = Application->ExeName;
      String newname = oldname + "tmp";      //Neuen Namen festlegen
    
      rename(oldname.c_str(),newname.c_str()); //Exe umbennen 
    
      TFileStream *f = new TFileStream(newname,fmOpenRead); //Auf Exe lesend zugreifen
    
      oldname +="tst"; 
    
      TFileStream *f2 = new TFileStream(oldname,fmCreate); //Neue Datei erzeugen
    
      f2->CopyFrom(f,0);  //Inhalt der exe dort hineinschreiben
      f2->Write("test",4); //Hier deine Logdaten hintendranhängen
    
      delete f;
      delete f2;
      rename(oldname.c_str(),Application->ExeName.c_str()); //Datei wieder zurück umbennenen
    

    Die Sache hat aber einen Haken: Die Datei newname läßt sich, solange dein Programm aktiv ist, nicht löschen.
    Und #include <stdio.h> nicht vergessen


Anmelden zum Antworten