Ich habe eine Funktion geschrieben, die mithilfe einer CRC-Prüfsumme nach einem beschädigten Archiv sucht.
Zum Testen habe ich gerade das Archiv geöffnet und den Inhalt mit einem Hex-Editor verschlüsselt. Das Problem ist, dass ich nicht glaube, dass dies der richtige Weg ist, eine beschädigte Datei zu generieren.
Gibt es eine andere Möglichkeit, eine "kontrollierte Beschädigung" zu erstellen, damit sie nicht völlig zufällig ist, sondern simulieren kann, was mit wirklich beschädigten Archiven passiert? Ich musste nie absichtlich etwas beschädigen, daher bin ich mir nicht sicher, wie ich das tun soll, abgesehen vom zufälligen Verwürfeln von Daten in einer Datei.
files
corruption
rataplan
quelle
quelle
Antworten:
Ich habe auch nicht viel Fuzz-Tests gemacht , aber hier sind zwei Ideen:
Schreiben Sie einige Nullen in die Mitte der Datei. Verwenden Sie
dd
mitconv=notrunc
. Dies schreibt ein einzelnes Byte (Blockgröße = 1 Anzahl = 1):Die Verwendung
/dev/urandom
als Quelle ist ebenfalls eine Option.Alternativ können Sie auch mehrere 4k-Löcher mit stanzen
fallocate --punch-hole
. Sie können sogarfallocate --collapse-range
eine Seite ausschneiden, ohne ein mit Nullen gefülltes Loch zu hinterlassen. (Dies ändert die Dateigröße).Ein Download, der an der falschen Stelle fortgesetzt wird, entspricht dem
--collapse-range
Szenario. Ein unvollständiger Torrent entspricht dempunch-hole
Szenario. (Sparse-Datei oder vorab zugewiesene Speicherbereiche, die entweder an einer noch nicht geschriebenen Stelle als Null gelesen werden.)Ein fehlerhafter Arbeitsspeicher (auf dem System, von dem Sie die Datei heruntergeladen haben) kann zu Beschädigungen führen, und optische Laufwerke können auch Dateien beschädigen (deren ECC ist nicht immer stark genug, um perfekt von Kratzern oder Verblassen des Farbstoffs wiederherzustellen).
DVD-Sektoren (ECC-Blöcke) sind 2048B groß , es können jedoch Einzelbyte- oder sogar Einzelbitfehler auftreten. Einige Laufwerke geben Ihnen wahrscheinlich die fehlerhaften, nicht korrigierbaren Daten anstelle eines Lesefehlers für den Sektor, insbesondere wenn Sie im unformatierten Modus lesen oder wenn er aufgerufen wird.
quelle
Die anderen Antworten scheinen hauptsächlich mit Hardwarefehlern zu tun zu haben. Lassen Sie mich einige durch Software verursachte Fehler auflisten:
Diese Dinge sind ziemlich harmlos, wenn sie mit Textdateien geschehen, aber im Allgemeinen tödlich, wenn sie auf Binärdateien angewendet werden.
quelle
Verwenden Sie
dd
diese Option, um die Datei zu kürzen, oder verwenden Sie einen Binäreditorhexer
, um einige Fehler zu bearbeiten und einzuführen.Beispiel für das Abschneiden einer Datei mit dd
Erstellen Sie eine 5MB-Datei
Schneiden Sie 10 Bytes am Ende ab
Hexer-Manpage
quelle
dd
, wird ein reales Szenario simuliert, in dem nur ein Teil der Datei erstellt wird. Und das Editieren,hexer
um gefälschte Inhalte einzuführen, simuliert eine andere Art von Korruption. Abgesehenmd5sum
davon, dass es sich lohnt, sich das anzuschauen, berechnet es die md5-Prüfsumme für eine Datei.dd
?Vorschlag:
Beginnen Sie mit dem Schreiben in ein Archiv und beenden Sie das Schreiben, bevor es abgeschlossen ist. Dies kann bei Stromausfällen und anderen Szenarien auftreten.
Reales Szenario:
Ich habe einmal eine Zip-Datei beschädigt, indem ich versucht habe, mehr Daten darauf zu kopieren, als auf das Medium passen würden. Windows (dies war Windows 7 im abgesicherten Modus, ftr) hat versucht, die Aktion abzuschließen, bevor herausgefunden wurde, ob genügend Speicherplatz vorhanden ist, und bis es herausgefunden hat, war die Datei zur Hälfte vollständig und daher beschädigt. Ich hoffe, sie haben dieses Problem in späteren Versionen von Windows behoben, oder das war nur eine Sache im abgesicherten Modus.
quelle
Eine andere häufige Art der Beschädigung ist das Bit-Twiddling: Ein einzelnes Bit (oder mehrere Bits) wird in einem Datenstrom umgeschaltet.
So ein Byte
1111 0000
werden könnte, sagen,1111 0010
oder1011 0000
oder1110 1100
oder was auch immer.Paritäts- und Count-the-One-Prüfsummensysteme haben Probleme mit Dingen wie der
1110 1000
gleichen Anzahl von Mengen und Unmengen, da sowohl die Parität als auch die Anzahl von Einsen gleich bleiben.Das Ersetzen aller Instanzen eines zufälligen Zeichens durch sein Inverses, z. B. 0x57 bis 0x75 ('9' bis 'K') oder umgekehrt, ist möglicherweise nicht erkennbar. Für Systeme mit mysql gibt es den Befehl "replace" für genau diesen Zweck:
Sie können auch versuchen, die Buchstaben K und 9 zu vertauschen. Dies ist ein besonders guter Test, wenn beide gleich oft in der Datei vorkommen:
Verwenden Sie
man replace
für weitere Informationen.quelle
Zufällige Änderungen an fehlerhaften Testdaten sind kein guter Ansatz, da Sie das Beispiel nicht reproduzieren können, um die Tests erneut auszuführen.
Ich würde mich über nur 3 Samples freuen, die nur 1 Bit im ersten Byte, im letzten Byte und in einem beliebigen mittleren Byte ändern. Aber nur 1 Bit, nicht das ganze Byte.
Das beste Testmuster wäre jedoch eines, bei dem Sie Samples generieren könnten, indem Sie jedes einzelne Bit der Datei vom ersten bis zum letzten Byte ändern. Dies kann (normalerweise) nicht mit üblichen Werkzeugen erreicht werden, man muss eines bauen (denke ich).
Mit diesem Ansatz isolieren Sie viele Möglichkeiten, einschließlich Endianess, wenn Ihr Algorithmus auf einer Art von Endianess basiert. In anderen Händen kann die Verarbeitung einer großen Probe viel Zeit in Anspruch nehmen.
Zuletzt werden Ihre Tests durch Abschneiden oder Hinzufügen von Bytes abgeschlossen.
quelle