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 habeif (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 umbennenenDie 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