Использование grep для поиска шестнадцатеричных строк в файле

Я весь день пытался заставить это работать. Кто-нибудь знает, как получить grep или что-то в этом роде, чтобы получить смещения шестнадцатеричных строк в файле?

у меня есть куча шестнадцатеричных дампов, которые мне нужно проверить на строки, а затем запустить снова и проверить, изменилось ли значение.

Я пробовал hexdump и dd, но проблема в том, что это поток, я теряю смещение для файлов.

кто-то должен был эту проблему и решение. Что я могу делать?

чтобы уточнить, у меня есть ряд сброшенных областей памяти из GDB.

Я пытаюсь сузить число, отыскивая все места, где хранится число, а затем делаю это снова и проверяю, хранится ли новое значение в том же месте памяти.

Я не могу заставить grep что-либо делать, потому что я ищу шестнадцатеричные значения, поэтому все время, когда я пытался (например, базиллион, грубо), он не даст мне правильный вывод.

шестнадцатеричные дампы просто полные двоичные файлы, отцы находятся в пределах значений float в larges so 8? байты?

шаблоны не обертывают линии,которые я знаю. Я знаю, что он меняется, и я могу сделать тот же процесс и сравнить списки, чтобы увидеть, какое совпадение. Шестнадцатеричные дампы, как правило, в конечном итоге (в сумме) 100 мегов-иш.

Perl может быть вариантом, но на данный момент я бы предположил, что мое отсутствие знаний с bash и его инструментами является основным виновником.

его a немного сложно объяснить результат, который я получаю, так как я действительно не получаю никакого результата..

Я ожидаю (и ожидаю) чего-то вроде:

<offset>:<searched value>

который является довольно хорошо стандартным выходом, который я обычно получаю с grep -URbFo <searchterm> . > <output>

проблема, когда я пытаюсь поиск hex значений, я получаю проблему, если только не искать шестнадцатеричные значения, так что если я ищу 00 я должен получить миллион просмотров, потому что это всегда blankspace, но вместо этого он ищет 00 как текст, так и в hex, 3030. Есть идеи?

Я могу заставить его через hexdump или что-то из ссылки, но потому что его поток он не даст мне смещения и имя файла, в котором он нашел совпадение.

используя grep -b опция, похоже, тоже не работает, я попробовал все флаги, которые казались полезными для моей ситуации, и ничего не сработало.

используя xxd -u /usr/bin/xxd в качестве примера я получаю вывод, который был бы полезен, но я не могу использовать это для испытующий..

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

хороший выход, только то, что я хочу видеть, но это просто не работает для меня в этой ситуации..

это некоторые из вещей, которые я пробовал после отправки этого:

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.....

6 ответов


мы попробовали несколько вещей, прежде чем прийти к приемлемому решению:

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.....

затем обнаружили, что мы можем получить полезные результаты с

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

обратите внимание, что использование простой цели поиска, такой как "DF", будет неправильно соответствовать символам, которые охватывают границы байтов, т. е.

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

поэтому мы используем Ored regexp для поиска " DF " или " DF " (searchTarget предшествует или следует пробел).

окончательный результат, кажется,

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............
--------------------------------------------^^

Это, кажется, работает для меня:

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

краткая форма:

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

пример:

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

вывод (Cygwin binary):

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

так что вы можете grep это снова, чтобы извлечь смещения. Но не забудьте снова использовать двоичный режим.


grep имеет переключатель a-P, позволяющий использовать синтаксис Perl regexp регулярное выражение perl позволяет просматривать байты, используя \x.. синтаксис.

таким образом, вы можете искать заданную шестнадцатеричную строку в файле с: grep -aP "\xdf"

но outpt не будет очень полезен; действительно, лучше сделать регулярное выражение на выходе hexdump;

grep-P может быть полезно, однако, просто найти файлы, соответствующие заданному двоичному шаблону. Или сделать двоичный запрос шаблона, который фактически происходит в тексте (см., например, как regexp CJK идеографий (в utf-8) )


есть также довольно удобный инструмент под названием binwalk, написанный на python, который обеспечивает сопоставление двоичных шаблонов (и многое другое). Вот как вы будете искать двоичную строку, которая выводит смещение в десятичном и шестнадцатеричном виде (из docs):

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

Если вы хотите искать печатные строки, вы можете использовать:

strings -ao filename | grep string

строки выводит все для печати строки из двоичного файла с смещениями, и grep будет искать внутри.

Если вы хотите найти любой двоичную строку, вот ваш друг:


Я просто использовал этот:

grep -c $'\x0c' filename

для поиска и подсчета управляющего символа страницы в файле..

Итак, чтобы включить смещение в вывод:

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

Я просто конвейер результат меньше, потому что символ я greping для не печатает хорошо, и тем меньше отображает результаты чисто. Пример вывода:

21:^L
23:^L
2005:^L