Eine mögliche Lösung (vorausgesetzt, Sie können eine Kopie der Datei erstellen) kann das folgende Beispiel verwenden
- Es wird angenommen, dass das Startmuster hexadezimal 4f 0f 87 82 ist
- Es sei angenommen, dass das Endmuster hex fb 8c e2 a0 ist
- Angenommen, die Eingabedatei wird aufgerufen
tf
und hat eine Länge von 5000 Byte
dann
Kopie tf
einer neuen Datei blah
mit geändertem Startmuster erstellen
$ LC_ALL=C sed 's/'`printf "\x4f\x0f\x87\x82"`'/'`printf "AAAA"`'/' <tf > blah
Suchen Sie nun den Ort, an dem sich die Dateien befinden,tf
und blah
unterscheiden Sie sich ( Note-Sed schreibt ein zusätzliches Byte mit einem Zeilenumbruch am Ende der geänderten Datei, sodass wir bis zur Länge der Originaldatei vergleichen tf
. Die generierte Datei blah
sollte ein Byte länger sein ).
$ cmp -n 5000 -b tf blah
Dies gibt einen Byte-Offset, bs, bei dem sich Dateien unterscheiden, z.
tf blah differ: byte 4337, line 10 is 117 O 101 A
mache jetzt dasselbe für das Endmuster
$ LC_ALL=C sed 's/'`printf "\xfb\x8c\xe2\xa0"`'/'`printf "AAAA"`'/' < tf > blah2 $ cmp -n 5000 -b tf blah2 tf blah2 differ: byte 4433, line 10 is 373 ? 101 A
Jetzt verwenden dd
, um einen Teil des Interesses zu extrahieren
dd if=tf skip=4336 bs=1 count=100 > fbit
Einige zusätzliche Hinweise:
Einige Versionen von Sed unterstützen eine
-b
Option, die die Eingabedatei als binär behandelt. Andere Versionen haben eine-z
Option, die Zeilen durch NUL-Zeichen voneinander trennt. Entweder wurden übereinstimmende Muster, die eine neue Zeile enthalten, oder über eine neue Zeile aufgeteilt, nicht getestet.das
count=100
hängt von der Länge des angepaßten Musters abhängen und ob das angepasste Muster ist in dem Extrakt enthalten sein (das war in der Frage nicht klar). Die allgemeine Formel lautet count = (Endoffset) - (Startoffset) + (Größe des Endmusters) . Die Teile für das spezifische Beispiel sind 4433-4337 + 1, was 97 Bytes ergibt. Dies ist vom Beginn des Anfangsmusters bis einschließlich des ersten Bytes des Endmusters. Dann werden zusätzliche 3 Bytes hinzugefügt, um in diesem Beispiel 100 zu ergeben, da das Endmuster vier Bytes hatte und das Beispiel das Endmuster enthält. Wenn das endgültige Muster nicht erwünschtcount=96
wäre, wäre dies der Wert.Ein Ansatz, der robuster gegenüber neuen Zeilen ist und den Befehl hexdump verwendet, ist möglich. Ich habe diesen Ansatz nicht vollständig getestet. Es würde im Wesentlichen hexdump mit ein wenig sed, grep und tr verwenden, um die ursprüngliche Binärdatei in ein hexadezimales ASCII-Format zu konvertieren. Dann könnte derselbe Prozess angewendet werden, aber mit mehr fummeliger Arithmetik usw. Der erforderliche Hexdump-Befehl wäre
hexdump -v -x tf | sed s/'^[0-9]*\(.*\)/\1/' | sed s'/ *//g' | grep '[0-9]' | tr -d '\n' > tf.txt
Nach dem
hexdump
Schritt kann das gleiche Verfahren vonsed
undcmp
angewendet werden. Das übereinstimmende Muster muss aktualisiert werden, um Hex-Dump-ASCII-Zeichen und nicht den Roh-Hex-Druck zu verwenden.Dieser Ansatz sollte auch Zeilenumbrüche berücksichtigen.
LC_ALL=C
scheint unter OSX standardmäßig erforderlich zu sein. Ohne siesed
gibt der Befehl einen Fehler ausRE error: illegal byte sequence
. Dies gilt möglicherweise nicht für alle Plattformen und / oder Betriebssystemdistributionen.