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

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

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

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

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

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

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

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

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

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

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

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

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

<offset>:<searched value>

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

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

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

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

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

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

Хороший результат, просто то, что я вижу wana, но это просто не работает для меня в этой ситуации.

Вот некоторые из вещей, которые я пробовал с момента публикации:

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

Ответ 1

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

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 для поиска 'DF' ИЛИ ​​'DF' (для параметра searchTarget предшествует пробел char).

Конечным результатом будет

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

Ответ 2

Кажется, это работает для меня:

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>

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

strings -ao filename | grep string
Строки

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

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

Ответ 6

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

grep -c $'\x0c' filename

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

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

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

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

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