[PYTHON] So tarnen Sie eine ZIP-Datei als PNG-Datei

Häufig gestellte Fragen

Was bedeutet "sich als ZIP-Datei als PNG-Datei ausgeben"?

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.

Kann ich eine Postleitzahl verschleiern?

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.

Was sind die Vorteile der Verkleidung?

Ich weiß es nicht.

Grundstruktur der ZIP-Datei und Identitätswechselmethode 1

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.

zip_format.png

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.

Grundstruktur der PNG-Datei und Identitätswechselmethode 2

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.

png_format.png

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.

png_chunk.png

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.

Identitätswechselverfahren

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.

  1. Geben Sie die Signatur der PNG-Datei aus
  2. Geben Sie den IHDR-Block einer vorhandenen PNG-Datei aus
  3. Geben Sie die Größe der vorhandenen ZIP-Datei aus (ZIP-Container-Block "Länge").
  4. Geben Sie den "Chunk-Typ" ziPc des ZIP-Container-Chunks aus
  5. Ausgabe vor "CEN" der vorhandenen ZIP-Datei ("Chunk-Daten" von hier)
  6. Ausgabe (Wiederholung) unter Korrektur des CEN der vorhandenen ZIP-Datei
  7. Kopieren Sie alles zwischen dem Ende von "CEN" und "EOCD" in die vorhandene ZIP-Datei
  8. Korrigieren Sie das EOCD der vorhandenen ZIP-Datei und geben Sie es aus
  9. Kopieren Sie alles nach dem "EOCD" in die vorhandene ZIP-Datei (bisher "Chunk-Daten").
  10. Berechnen Sie CRC32 und geben Sie es von "Chunk-Typ" in "Chunk-Daten" oben aus ("CRC" des ZIP-Container-Chunks).
  11. Geben Sie alles nach dem IHDR-Block der vorhandenen PNG-Datei aus

das ist alles.

Implementierungsbeispiel

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

So tarnen Sie eine ZIP-Datei als PNG-Datei
So erstellen Sie eine Konfigurationsdatei
So verwenden Sie eine andere Datei als .fabricrc als Konfigurationsdatei
[Python] Speichern einer CSV-Datei als eindimensionale Array-Daten
Lesen einer CSV-Datei mit Python 2/3
So erstellen Sie eine JSON-Datei in Python
So lesen Sie Dateien in verschiedenen Verzeichnissen
So zeigen Sie DataFrame als Tabelle in Markdown an
So verwandeln Sie eine .py-Datei in eine .exe-Datei
So konvertieren Sie ein Mel-Spektrogramm zurück in eine WAV-Datei
So rufen Sie eine Funktion auf
Laden Sie eine Datei in Dropbox hoch
Wie man ein Terminal hackt
Verwendung von Fujifilm X-T3 als Webcam unter Ubuntu 20.04
So setzen Sie einen Hyperlink zu "file: // hogehoge" mit sphinx-> pdf
So führen Sie eine Python-Datei an einer Windows 10-Eingabeaufforderung aus
So importieren Sie NoteBook als Modul in Jupyter (IPython)
So importieren Sie Dateien in Python an eine beliebige Stelle
So drucken Sie Zeichen als Tabelle mit der Druckfunktion von Python
Verwendung von cuML SVC als Gridsearch-CV-Klassifikator
So registrieren Sie ein Paket in PyPI (Stand September 2017)
[Python] So geben Sie eine Pandas-Tabelle in eine Excel-Datei aus
So importieren Sie NoteBook als Modul in Jupyter (IPython)
Verwendung der Zip-Funktion
So setzen Sie einen symbolischen Link
Wie man einen lockeren Bot macht
So erstellen Sie ein Conda-Paket
Schreiben Sie die Standardausgabe in eine Datei
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
So erstellen Sie eine virtuelle Brücke
Wie erstelle ich eine Docker-Datei?
[Blender] So erstellen Sie ein Blender-Plug-In
So löschen Sie einen Docker-Container
Wie erstelle ich einen Crawler?
Verwendung der Zip-Funktion von Python
So fügen Sie eine CSV-Datei mit Pandas in eine Excel-Datei ein
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
So erstellen Sie einen Befehl zum Lesen der Einstellungsdatei mit Pyramide
So geben Sie eine .py-Datei an, die beim Start in IPython 0.13 geladen werden soll
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
Wie man Jupytext gut einstellt, wenn man Code als Team verwaltet
So erstellen Sie mit Faker eine CSV-Dummy-Datei mit Japanisch
So stellen Sie eine Webanwendung in der Alibaba Cloud als Freiberufler bereit
So bekommen Sie einen Ingenieur aus Ihren 30ern
[ROS2] So spielen Sie eine Bag-Datei mit Start im Python-Format ab
[Python] So kratzen Sie eine lokale HTML-Datei und geben sie mit Beautiful Soup als CSV aus
[Python] So konvertieren Sie eine Datenbankdatei in CSV
Wie man Selen so leicht wie möglich macht
So erstellen Sie einen Klon aus Github
So teilen und speichern Sie einen DataFrame
So erstellen Sie eine Sphinx-Übersetzungsumgebung
So erstellen Sie einen Git-Klonordner
Qiita (1) Wie schreibe ich einen Codenamen?
So fügen Sie ein Paket mit PyCharm hinzu
[Python] Wie man eine Klasse iterierbar macht
So zeichnen Sie ein Diagramm mit Matplotlib
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
So konvertieren Sie Python in eine exe-Datei