Auf den ersten Blick sieht es aus wie eine PNG-Datei, und Sie können Bilder mit dem PNG-Decoder problemlos anzeigen. Wenn Sie jedoch die Erweiterung in ZIP umschreiben (im Fall eines Betriebssystems, das den Dateityp anhand der Erweiterung bestimmt), kann sie als ZIP-Datei behandelt werden. Nennen wir eine ZIP-Datei, die als PNG-Datei getarnt ist. Das Erstellen einer solchen Datei wird auch als "Identitätswechsel einer ZIP-Datei als PNG-Datei" bezeichnet.
Mit anderen Worten, erstellen Sie eine Datei, die sowohl als PNG-Datei als auch als ZIP-Datei verwendet werden kann.
Grundsätzlich soll eine Kombination aus einer vorhandenen kleinen PNG-Datei und einer vorhandenen kleinen ZIP-Datei gefälscht werden.
Aus einem anderen Blickwinkel ist es möglich, eine PNG-Datei als ZIP-Datei zu tarnen.
Es gibt einige Einschränkungen.
Wenn Sie die Datei als PNG oder ZIP ändern (Bilder mit PNG filtern, Dateien mit ZIP hinzufügen / löschen usw.), besteht eine hohe Wahrscheinlichkeit, dass Sie sie danach nicht mehr als gefälschte Datei verwenden können.
Es kann verschiedene andere Implementierungsbeschränkungen geben.
Ich weiß es nicht.
Ich werde nicht auf die detaillierten Spezifikationen des ZIP-Dateiformats eingehen. Ignorieren Sie auch ZIP64 und teilen Sie ZIP.
Die Grundstruktur einer ZIP-Datei kann leicht verstanden werden, indem sie dem "Ende des zentralen Verzeichnisses" (im Folgenden "EOCD") am Ende der Datei folgt.
"EOCD" hat die Position "Zentrales Verzeichnis" (im Folgenden "CEN"), dh den Versatz vom Anfang der Datei. Zusätzlich existiert "CEN" für die Anzahl der Dateien im Archiv, und jedes "CEN" hat die Position (Versatz) von "Local File Header" (im Folgenden "LOC").
Der Hauptteil der Datei (komprimiert, unkomprimiert, verschlüsselt, einfacher Text usw.) wird nach "LOC" gespeichert. Ich habe verschiedene Erklärungen weggelassen.
Mit dieser Struktur können Daten, die sich am Anfang oder Ende der ZIP-Datei oder zwischen den einzelnen Daten befinden, normal als ZIP-Datei behandelt werden.
Als spezielles Beispiel kann eine selbstextrahierende ZIP-Datei (EXE-Datei) von den meisten ZIP-Archivierern als normale ZIP-Datei behandelt werden. Aus einem anderen Blickwinkel kann die selbstextrahierende ZIP-Datei sowohl als EXE-Datei als auch als ZIP-Datei behandelt werden.
Aufgrund dieser Eigenschaften kann die gesamte ZIP-Datei, selbst wenn sie in einer anderen Datei gespeichert ist, als normale ZIP-Datei behandelt werden.
Wenn Sie jedoch eine vorhandene ZIP-Datei in eine andere Datei einbetten, muss der Teil, dessen Versatz vom Anfang der Datei abweicht, ordnungsgemäß korrigiert werden. Die spezifischen Korrekturpunkte sind der "CEN" -Versatz im "EOCD" und der "LOC" -Versatz in jedem "CEN". (Wenn Sie Daten für ZIP64 erweitert haben, gibt es dort möglicherweise auch einen Offset, aber dieses Mal werde ich ihn ignorieren.)
Die Bytereihenfolge der ZIP-Dateien ist übrigens wenig tondian.
Ich werde nicht auf die detaillierten Spezifikationen des PNG-Dateiformats eingehen.
Die Grundstruktur von PNG besteht darin, dass es zu Beginn eine 8-Byte-PNG-Dateisignatur hat, gefolgt von mehreren Blöcken. Einige Chunks sind obligatorisch und andere optional (Zusatzchunks). Einige Chunks haben eine feste Reihenfolge (z. B. IHDR-Chunks am Anfang, IEND-Chunks am Ende usw.), andere jedoch in beliebiger Reihenfolge.
Jeder Block besteht aus "Länge (4 Byte)", "Blocktyp (4 Byte)", "Blockdaten (beliebige Anzahl von Bytes)" und "CRC (4 Byte)". Die Bytereihenfolge ist ein Big Endian.
"Länge" gibt die Länge von "Blockdaten" an ("Länge" selbst enthält nicht "Blocktyp" und "CRC"). Der Maximalwert beträgt $ 2 ^ {31} -1 $ Bytes. "CRC" ist der Wert, der durch Berechnen von CRC32 für den Bereich von "Blocktyp" und "Blockdaten" erhalten wird.
Der Chunk-Typ besteht aus 4 alphabetischen Zeichen im ASCII-Code. Es wird zwischen Groß- und Kleinschreibung unterschieden. (In den Spezifikationen wird gesagt, dass es als Binärdaten behandelt werden sollte, anstatt als Zeichen behandelt zu werden, aber es wird zur Vereinfachung der Erklärung auf Zeichenbasis beschrieben.)
Darüber hinaus ist die Bedeutung je nach Groß- und Kleinschreibung jeder Ziffer unterschiedlich (in den Spezifikationen anhand des Ein / Aus des 5. Bits beurteilen).
Ziffer | 5. Bit Name | Großbuchstabe(off) | Kleinbuchstaben(on) |
---|---|---|---|
1. Ziffer | Hilfsbit | Obligatorisches Stück | Hilfsstück |
2. Ziffer | Privates Bit | Öffentliches Stück | Privates Stück |
3. Ziffer | Reservierte (für zukünftige Erweiterungen) Bits | (Anlagekapital) | (Verwenden Sie keine Kleinbuchstaben.) |
4. Ziffer | Kopierbares Bit | Kann nicht kopiert werden, wenn das Bild geändert wird | Kann kopiert werden, wenn das Bild geändert wird |
Für die Anzeige des Bildes sind obligatorische Blöcke erforderlich. Wenn der PNG-Decoder also auf einen unbekannten erforderlichen Block stößt, liegt ein Fehler vor. Wenn Sie dagegen auf einen unbekannten Hilfsblock stoßen, können Sie ihn ignorieren.
Öffentliche Chunks sind Chunks, die in Spezifikationen und öffentlichen Chunk-Listen registriert sind, und private Chunks werden als für die App eindeutige Chunks verwendet. Im Allgemeinen denke ich, dass Sie einen Wachmann brauchen, der Konflikte zwischen privaten Blöcken bewältigen kann.
Im Gegensatz zu anderen Bits gibt das kopierbare Bit an, ob ein unbekannter Block so kopiert werden kann, wie er ist, wenn das Bild mit einem PNG-Editor (einem Programm, das PNG-Dateien usw. filtert) anstelle eines PNG-Decoders verarbeitet wird. ..
Dieses Mal möchte ich meinen eigenen "Block, der ZIP-Dateien speichert" als Hilfsblock erstellen. Jeder Chunk-Typ ist in Ordnung, aber da es sich um einen "ZIP-Container-Chunk" handelt, werde ich versuchen, ihn zu "ziPc" zu machen. Wir werden den Ort direkt nach dem IHDR-Block erstellen. Die Größe der imitierten ZIP-Datei muss weniger als 2 GB betragen, da die gesamte ZIP-Datei im Block gespeichert werden muss.
Der Grund, warum der "ZIP-Container-Chunk" unmittelbar nach dem "IHDR" -Block platziert wird, liegt darin, dass der IHDR-Chunk eine feste Länge hat und die Wahrscheinlichkeit groß ist, dass sich der Versatz der ZIP-Datei auch nach der Verarbeitung durch den PNG-Editor nicht verschiebt. ist. Natürlich funktioniert es nicht, wenn Sie einen anderen Block zwischen dem IHDR-Block und dem ziPc-Block einfügen oder den ziPc-Block löschen.
Organisieren Sie abschließend das Identitätswechselverfahren. Angenommen, Sie möchten eine gefälschte Datei basierend auf einer vorhandenen ZIP-Datei und einer PNG-Datei generieren.
ziPc
des ZIP-Container-Chunks ausdas ist alles.
Es gibt keinen besonders schwierigen Prozess (der schwierigste ist die Berechnung von CRC32). Wenn Sie also die Binärdatei bedienen können, kann sie meiner Meinung nach in jeder Sprache implementiert werden.
Beachten Sie, dass ZIP Little Endian und PNG Big Endian ist.
Vorerst habe ich ein Beispiel gegeben, das in Java / Javascript / Python auf Github implementiert ist.
Recommended Posts