Ich erstelle ein einfaches selbstextrahierendes Archiv mit einer magischen Zahl, um den Anfang des Inhalts zu markieren. Für jetzt ist es eine Textdatei:
MAGICNUMBER .... Inhalt der Textdatei
Als nächstes wird die Textdatei an das Ende der ausführbaren Datei kopiert:
Kopieren Sie programm.exe / b + Textdatei.txt / b sfx.exe
Ich versuche, das zweite Vorkommen der magischen Zahl zu finden (der erste wäre offensichtlich eine hartkodierte Konstante), indem ich den folgenden Code benutze:
%Vor%Aber aus irgendeinem Grund kopiere ich fast die gesamte Datei, nicht die letzten paar Kilobyte. Ist es wegen der Compiler-Optimierung, magische Konstante in while-Schleife von etwas ähnlichem inline?
Wie soll ich das Self-Extraction-Archiv richtig machen?
Ich vermutete, dass ich die Datei rückwärts lesen sollte, um Probleme des Compilers zu vermeiden, die magische Konstanten multiplizieren. Also habe ich meinen Code folgendermaßen geändert:
%Vor%Also ich habe die all-Datei einmal gescannt, festgestellt, dass ich zwar das letzte Vorkommen der magischen Nummer hätte und von hier bis zum Ende kopiert habe. Obwohl die Datei, die mit dieser Prozedur erstellt wurde, kleiner aussieht als im vorherigen Versuch, ist sie in keinster Weise dieselbe Datei, die ich an mein "selbstextrahierendes" Archiv angehängt habe. Warum?
Meine Vermutung ist, dass die Positionsberechnung des Anfanges der angehängten Datei falsch ist, weil die Konvertierung von binär in string verwendet wird. Wenn ja, wie sollte ich meine Positionsberechnung ändern, um sie korrekt zu machen?
Auch wie sollte ich magische Zahl wählen, dann mit echten Dateien arbeiten, zum Beispiel PDFs? Ich werde nicht in der Lage sein, pdfs leicht zu ändern, um vordefinierte magische Zahl darin einzuschließen.
Die einfachste Lösung ist das Ersetzen von
%Vor%mit
%Vor%Aber es gibt mehr Probleme mit dem ganzen Magic-String-Ansatz. In welcher Datei befindet sich die magische Zeichenfolge? Ich denke, dass die beste Lösung darin besteht, die Dateigröße hinter der Datei zu speichern. Die Extraktion ist viel einfacher: Lesen Sie die Länge der letzten Bytes und lesen Sie die benötigte Anzahl an Bytes vom Ende der Datei.
Update : Dies sollte funktionieren, wenn Ihre Dateien nicht sehr groß sind. (In diesem Fall müssten Sie ein revolvierendes Pufferpaar verwenden (um die Datei in kleinen Blöcken zu lesen)):
%Vor%Update2 : Dies sollte viel schneller sein, wenig Speicher verwenden und an Dateien aller Größe arbeiten, aber das Programm muss ordnungsgemäß ausführbar sein (mit einer Größe von mehreren 512 Bytes):
%Vor%Lesen Sie hier einige Ansätze: Ссылка
Ich erstelle ein einfaches selbstextrahierendes Archiv mit einer magischen Zahl, um den Anfang des Inhalts zu markieren. Für jetzt ist es eine Textdatei:
MAGICNUMBER .... Inhalt der Textdatei
Als nächstes wird die Textdatei an das Ende der ausführbaren Datei kopiert:
Kopieren Sie programm.exe / b + Textdatei.txt / b sfx.exe
Ich versuche, das zweite Vorkommen der magischen Zahl zu finden (der erste wäre offensichtlich eine hartkodierte Konstante), indem ich den folgenden Code benutze:
%Vor%Aber aus irgendeinem Grund kopiere ich fast die gesamte Datei, nicht die letzten paar Kilobyte. Ist es wegen der Compiler-Optimierung, magische Konstante in while-Schleife von etwas ähnlichem inline?
Wie soll ich das Self-Extraction-Archiv richtig machen?
Ich vermutete, dass ich die Datei rückwärts lesen sollte, um Probleme des Compilers zu vermeiden, die magische Konstanten multiplizieren. Also habe ich meinen Code folgendermaßen geändert:
%Vor%Also ich habe die all-Datei einmal gescannt, festgestellt, dass ich zwar das letzte Vorkommen der magischen Nummer hätte und von hier bis zum Ende kopiert habe. Obwohl die Datei, die mit dieser Prozedur erstellt wurde, kleiner aussieht als im vorherigen Versuch, ist sie in keinster Weise dieselbe Datei, die ich an mein "selbstextrahierendes" Archiv angehängt habe. Warum?
Meine Vermutung ist, dass die Positionsberechnung des Anfanges der angehängten Datei falsch ist, weil die Konvertierung von binär in string verwendet wird. Wenn ja, wie sollte ich meine Positionsberechnung ändern, um sie korrekt zu machen?
Auch wie sollte ich magische Zahl wählen, dann mit echten Dateien arbeiten, zum Beispiel PDFs? Ich werde nicht in der Lage sein, pdfs leicht zu ändern, um vordefinierte magische Zahl darin einzuschließen.
Sie können die komprimierte Datei als Ressource zum Projekt selbst hinzufügen:
Projekt & gt; Eigenschaften
Setzen Sie die Eigenschaft dieser Ressource auf Binary
.
Sie können die Ressource dann mit
abrufen %Vor%Die einfachste Lösung ist das Ersetzen von
%Vor%mit
%Vor%Aber es gibt mehr Probleme mit dem ganzen Magic-String-Ansatz. In welcher Datei befindet sich die magische Zeichenfolge? Ich denke, dass die beste Lösung darin besteht, die Dateigröße hinter der Datei zu speichern. Die Extraktion ist viel einfacher: Lesen Sie die Länge der letzten Bytes und lesen Sie die benötigte Anzahl an Bytes vom Ende der Datei.
Update : Dies sollte funktionieren, wenn Ihre Dateien nicht sehr groß sind. (In diesem Fall müssten Sie ein revolvierendes Pufferpaar verwenden (um die Datei in kleinen Blöcken zu lesen)):
%Vor%Update2 : Dies sollte viel schneller sein, wenig Speicher verwenden und an Dateien aller Größe arbeiten, aber das Programm muss ordnungsgemäß ausführbar sein (mit einer Größe von mehreren 512 Bytes):
%Vor%Lesen Sie hier einige Ansätze: Ссылка
Suche rückwärts statt vorwärts (vorausgesetzt, deine Datei enthält diese magische Zahl nicht).
Oder fügen Sie Ihre (Text-) Datei und zuletzt ihre Länge (oder die Länge der Original-EXE) an, so dass Sie nur das letzte DWORD / einige Bytes lesen müssen, um zu sehen, wie lange die Datei ist - dann ist keine magische Zahl erforderlich .
Speichern Sie die Datei robuster als zusätzlichen Datenabschnitt in der ausführbaren Datei. Dies ist fiddly ohne externe Tools, da es die Kenntnis des PE-Datei-Format benötigt für NT ausführbare Dateien benötigt, q.v. Ссылка
Probieren Sie es aus. Einige C # Stream IO 101:
%Vor%Suche rückwärts statt vorwärts (vorausgesetzt, deine Datei enthält diese magische Zahl nicht).
Oder fügen Sie Ihre (Text-) Datei und zuletzt ihre Länge (oder die Länge der Original-EXE) an, so dass Sie nur das letzte DWORD / einige Bytes lesen müssen, um zu sehen, wie lange die Datei ist - dann ist keine magische Zahl erforderlich .
Speichern Sie die Datei robuster als zusätzlichen Datenabschnitt in der ausführbaren Datei. Dies ist fiddly ohne externe Tools, da es die Kenntnis des PE-Datei-Format benötigt für NT ausführbare Dateien benötigt, q.v. Ссылка