it-swarm.com.de

Mit grep nach hexadezimalen Zeichenfolgen in einer Datei suchen

Ich habe den ganzen Tag versucht, das zum Laufen zu bringen. Weiß jemand, wie man grep oder ähnliches bekommt, um Offsets von Hex-Strings in einer Datei abzurufen?

Ich habe eine Reihe von Hexdumps, die ich auf Zeichenfolgen überprüfen und dann erneut ausführen und prüfen muss, ob sich der Wert geändert hat.

Ich habe hexdump und dd ausprobiert, aber das Problem ist, dass es sich um einen Stream handelt und ich meinen Offset für die Dateien verliere.

Jemand muss dieses Problem und eine Problemumgehung gehabt haben. Was kann ich tun?

Zur Verdeutlichung habe ich eine Reihe von Speicherbereichen aus GDB ausgegeben.

Ich versuche, eine Zahl einzugrenzen, indem ich alle Orte suche, an denen die Zahl gespeichert ist, es dann erneut mache und überprüfe, ob der neue Wert am gleichen Speicherort gespeichert ist.

Ich kann grep nicht dazu bringen, irgendetwas zu tun, weil ich nach Hex-Werten suche, so dass es mir die ganze Zeit, die ich versucht habe (ungefähr wie ein Bazillion), nicht die richtige Ausgabe gibt.

Die Hex-Dumps sind nur vollständige Binärdateien, die Paterns liegen innerhalb der Float-Werte, also 8? Bytes?

Die Muster umschließen nicht die Linien, die mir bekannt sind. Mir ist bewusst, woran es sich ändert, und ich kann den gleichen Vorgang ausführen und die Listen vergleichen, um festzustellen, welche übereinstimmen. Die Hex-Dumps enden normalerweise (insgesamt) mit 100 Megas.

Perl KÖNNTE eine Option sein, aber an diesem Punkt würde ich annehmen, dass mein Mangel an Kenntnissen über Bash und dessen Tools der Hauptschuldige ist.

Es ist ein wenig schwer zu erklären, welche Ausgabe ich bekomme, da ich wirklich keine Ausgabe bekomme.

Ich erwarte (und erwarte) etwas in der Art von:

<offset>:<searched value>

Welches ist die ziemlich gute Standardausgabe, die ich normalerweise mit grep -URbFo <searchterm> . > <output> Bekommen würde?

Das Problem ist, wenn ich versuche, nach Hex-Werten zu suchen, bekomme ich das Problem, wenn ich nur nicht nach Hex-Werten suche. Wenn ich also nach 00 suche, bekomme ich eine Million Treffer, weil das immer die Leerstelle ist, aber stattdessen die Suche für 00 als Text, also in hex, 3030. Irgendeine Idee?

Ich KANN es durch hexdump oder etwas von der Verbindung erzwingen, aber weil es ein Strom ist, gibt es mir nicht die Versätze und den Dateinamen, in denen es eine Übereinstimmung fand.

Die Option grep -b Scheint auch nicht zu funktionieren, ich habe alle Flags ausprobiert, die für meine Situation nützlich erschienen, und nichts hat funktioniert.

Am Beispiel von xxd -u /usr/bin/xxd Erhalte ich eine Ausgabe, die nützlich wäre, aber ich kann sie nicht zum Suchen verwenden.

0004760: 73CC 6446 161E 266A 3140 5E79 4D37 FDC6  s.dF..&[email protected]^yM7..
0004770: BF04 0E34 A44E 5BE7 229F 9EEF 5F4F DFFA  ...4.N[."..._O..
0004780: FADE 0C01 0000 000C 0000 0000 0000 0000  ................

Gute Ausgabe, genau das, was ich sehen möchte, aber in dieser Situation funktioniert es nicht.

Dies sind einige der Dinge, die ich seit dem Posten versucht habe:

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....

root# grep -ibH "df" /usr/bin/xxd
Binary file /usr/bin/xxd matches
xxd -u /usr/bin/xxd | grep -H 'DF'
(standard input):00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....
26
user650649

Wir haben verschiedene Dinge versucht, bevor wir zu einer akzeptablen Lösung kamen:

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....


root# grep -ibH "df" /usr/bin/xxd
Binary file /usr/bin/xxd matches
xxd -u /usr/bin/xxd | grep -H 'DF'
(standard input):00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....

Dann haben wir festgestellt, dass wir brauchbare Ergebnisse mit erhalten können

xxd -u /usr/bin/xxd > /tmp/xxd.hex ; grep -H 'DF' /tmp/xxd

Beachten Sie, dass bei Verwendung eines einfachen Suchziels wie "DF" Zeichen, die sich über Byte-Grenzen erstrecken, falsch zugeordnet werden, d. H.

xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003  @.........S.....
--------------------^^

Also suchen wir mit einem ORed-Regexp nach 'DF' OR 'DF' (dem searchTarget, dem ein Leerzeichen vorangestellt oder gefolgt ist).

Das Endergebnis scheint zu sein

xxd -u -ps -c 10000000000 DumpFile > DumpFile.hex
egrep ' DF|DF ' Dumpfile.hex

0001020: 0089 0424 8D95 D8F5 FFFF 89F0 E8DF F6FF  ...$............
-----------------------------------------^^
0001220: 0C24 E871 0B00 0083 F8FF 89C3 0F84 DF03  .$.q............
--------------------------------------------^^
12
shellter

Das scheint bei mir zu funktionieren:

grep --only-matching --byte-offset --binary --text --Perl-regexp "<\x-hex pattern>" <file>

kurzform:

grep -obUaP "<\x-hex pattern>" <file>

Beispiel:

grep -obUaP "\x01\x02" /bin/grep

Ausgabe (Cygwin-Binär):

153: <\x01\x02>
33210: <\x01\x02>
53453: <\x01\x02>

Sie können dies also erneut abfragen, um Offsets zu extrahieren. Vergessen Sie jedoch nicht, den Binärmodus erneut zu verwenden.

56
Fr0sT

Es gibt auch ein ziemlich praktisches Tool namens binwalk , das in Python geschrieben ist und das einen binären Mustervergleich ermöglicht (und noch viel mehr). So würden Sie nach einer Binärzeichenfolge suchen, die den Offset in Dezimal- und Hexadezimalzeichen ausgibt (aus docs ):

$ binwalk -R "\x00\x01\x02\x03\x04" firmware.bin
DECIMAL     HEX         DESCRIPTION
--------------------------------------------------------------------------
377654      0x5C336     Raw string signature
11
Pierz

grep hat einen -P-Schalter, mit dem die Perl-Regexp-Syntax verwendet werden kann. Mit Perl-Regex können Bytes mit der Syntax\x .. betrachtet werden.

so können Sie nach einer bestimmten Hex-Zeichenfolge in einer Datei suchen mit: grep -aP "\xdf"

aber das Ergebnis wird nicht sehr nützlich sein; In der Tat ist es besser, eine reguläre Ausdrücke für die Hexdump-Ausgabe zu erstellen.

Das grep -P kann jedoch nützlich sein, um nur Dateien zu finden, die ein bestimmtes Binärmuster enthalten. Oder um eine Binärabfrage eines Musters durchzuführen, das tatsächlich in Text vorkommt (siehe zum Beispiel Wie man CJK-Ideogramme neu ausdrückt (in utf-8) )

9
Pablo Saratxaga

Wenn Sie nach druckbaren Zeichenfolgen suchen möchten, können Sie Folgendes verwenden:

strings -ao filename | grep string

zeichenfolgen geben alles druckbar Zeichenfolgen aus einer Binärdatei mit Offsets aus, und grep durchsucht sie.

Wenn Sie nach einer beliebigen binären Zeichenfolge suchen möchten, ist hier Ihr Freund:

5
jm666

Ich habe das gerade benutzt:

grep -c $'\x0c' filename

So suchen und zählen Sie ein Seitensteuerzeichen in der Datei.

So fügen Sie einen Offset in die Ausgabe ein:

grep -b -o $'\x0c' filename | less

Ich leite das Ergebnis nur an weniger weiter, weil das Zeichen, nach dem ich greife, nicht gut gedruckt wird und das Ergebnis umso weniger sauber angezeigt wird. Ausgabebeispiel:

21:^L
23:^L
2005:^L
4
user3510073