Erstellen einer selbstextrahierenden Datei mit C #

8

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.

    
Moonwalker 07.02.2013, 14:36
quelle

4 Antworten

3

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: Ссылка

    
Ark-kun 10.02.2013, 21:47
quelle
4

Probieren Sie es aus. Einige C # Stream IO 101:

%Vor%     
sircodesalot 07.02.2013 15:12
quelle
3
___ qstntxt ___

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.

    
___ qstnhdr ___ Erstellen einer selbstextrahierenden Datei mit C # ___ answer 14755218 ___

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%     
___ answer14802956 ___

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: Ссылка

    
___ tag123windows ___ ALLGEMEINER WINDOWS-SUPPORT IST OFF-TOPIC. Support-Fragen können unter https://superuser.com gestellt werden. Windows ist ein von Microsoft entwickeltes Betriebssystem. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Verwendung von Windows-APIs oder Windows-spezifischem Verhalten in Bezug auf Ihren Code bezieht, nicht nur, weil Sie Ihren Code unter Windows ausführen. ___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ answer14835887 ___

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. Ссылка

    
___ tag123archive ___ Ein Speicherort oder eine Datei, die andere Dateien oder Daten speichert, normalerweise mit Komprimierung, Verschlüsselung, Sortierung oder Organisation. ___ tag123exe ___ EXE ist eine allgemeine Dateinamenserweiterung für eine ausführbare Datei (ein Programm) in Microsoft Windows und anderen Betriebssystemen (z. B. DOS, OpenVMS, Symbian und OS / 2). ___ answer14754453 ___

Probieren Sie es aus. Einige C # Stream IO 101:

%Vor%     
___
Olivier Jacot-Descombes 07.02.2013 15:48
quelle
2

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. Ссылка

    
El Zorko 12.02.2013 15:26
quelle

Tags und Links