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

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

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

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

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

Чтобы уточнить, у меня есть серия выгруженных областей памяти из GDB.

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

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

Шестнадцатеричные дампы - это просто полные двоичные файлы, паттерны находятся в пределах значений с плавающей запятой при больших значениях, так что 8? bytes?

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

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

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

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

<offset>:<searched value>

Это довольно хороший стандартный вывод Обычно я использую grep -URbFo . >

Проблема в том, что когда я пытаюсь найти шестнадцатеричные значения, у меня возникает проблема, если я просто не ищу шестнадцатеричные значения, поэтому, если я ищу 00, я должен получить миллион совпадений, потому что это всегда пробел, но вместо этого он ищет 00 как текст, поэтому в шестнадцатеричном формате, 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.....
27
задан shellter 12 June 2011 в 12:18
поделиться

1 ответ

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

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):

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

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

56
ответ дан 28 November 2019 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: