Ich muss eine Hash-Funktion testen und möchte nur ein einziges Bit einer bestimmten Datei ändern.
Ich habe es mit dem Befehl dd versucht. Das funktioniert, aber ich kann nur ein ganzes Byte ändern und nicht nur ein bisschen.
sudo dd if=/dev/zero of=/file.bin bs=1 seek=10 count=1 conv=notrunc
Ich habe auch den Befehl sed mit einem regulären Ausdruck ausprobiert, aber da ich den Inhalt der Datei nicht kenne, kann ich nicht einfach ein "a" in ein "b" ändern.
Kennt jemand einen Befehl dafür?
Antworten:
Da die Datei möglicherweise Nullen enthält, schlagen textorientierte Filter wie
sed
fehl. Sie können jedoch eine Programmiersprache verwenden, die Nullen wieperl
oder verarbeiten kannpython
. Hier ist eine Lösung für Python 3. Aus Gründen der Lesbarkeit sind einige Zeilen länger als unbedingt erforderlich.Speichern Sie es in einer Datei (z. B.
bitflip
), machen Sie es ausführbar und führen Sie es mit dem zu ändernden Dateinamen und dem Offset in Bits aus . Beachten Sie, dass die vorhandene Datei geändert wird. Führen Sie es zweimal mit demselben Versatz aus, und Ihre Datei wird wiederhergestellt.quelle
Ich glaube nicht, dass es einen einzigen Befehl gibt. Hier ist ein einfaches Skript, speichern Sie es als "
flipbit
":Prüfung:
Dadurch wurde das niederwertige Bit (0) des dritten Zeichens umgedreht und das 'b' in 'c' geändert.
Als einzeiliger Befehl:
quelle
stdout
in eine Datei umleiten , um das Ergebnis zu speichern. Beispiel:perl flipbit.pl 1000000 1 data.tgz > data_corrupt.tgz
Endlich habe ich mit
xxd
und eine Lösung gefundendd
.Aber das ist hässlich.
quelle
echo -e "\x$((${a#0}^${b}))"
0x${a}
Wenn Sie wirklich verwenden möchten,
dd
ist hier ein Gräuel, der den Trick macht, indem er das höchste Bit im gegebenen Byte umdreht. Passen Sie die Einstellungen für dentr
Befehl an, um das ausgewählte Bit zu ändern.quelle
Einfache Lösung mit
head
,tail
,xxd
. Das folgende Beispiel kippt das niedrigstwertige Bit im letzten Byte von file.bin .quelle
Hier sind zwei
perl
Einzeiler. Der erste ändert die Dateibar
an Ort und Stelle:Der zweite liest Datei
foo
und schreibtbar
So passen Sie sich an Ihre Anwendung an: Die 2 wählt das Byte aus: 0..file_length-1, dh 2 ist das 3. Byte. Die 5 wählt aus, welches Bit umgedreht werden soll: 0-7, dh 5 ist das 6. Bit. Dies funktioniert nur für Dateien, die in den Speicher passen.
Erläuterung
-p
Durchlaufen Sie die Datei, drucken Sie nach jeder Iteration,-0777
lesen Sie die gesamte Datei bei jeder Iteration in den Speicher (es gibt also nur eine Iteration).-e
Führen Sie den folgenden Perl-Code in der Schleife aus.substr
Wählen Sie ein einzelnes Zeichen in der Datei aus, beginnend mit Index 2^=chr
XOR dieses Zeichens mit 1 5 mal verschoben, dh 2 ^ 5Diese Antwort ist eine vereinfachte Version von Toddkaufmann
quelle