Использование grep для поиска шестнадцатеричных строк в файле - PullRequest
26 голосов
/ 12 июня 2011

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

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

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

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

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

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

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

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

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

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

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

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

<offset>:<searched value>

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

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

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

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

Используя в качестве примера 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 ]

55 голосов
/ 18 июня 2013

Мне кажется, это работает:

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>

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

12 голосов
/ 13 июня 2011

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

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, перед которым или после которой идет пробел).

Окончательный результат, по-видимому,

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............
--------------------------------------------^^
11 голосов
/ 10 декабря 2013

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

$ binwalk -R "\x00\x01\x02\x03\x04" firmware.bin
DECIMAL     HEX         DESCRIPTION
--------------------------------------------------------------------------
377654      0x5C336     Raw string signature
9 голосов
/ 22 февраля 2013

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

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

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

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

5 голосов
/ 12 июня 2011

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

strings -ao filename | grep string

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

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

4 голосов
/ 20 мая 2014

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

grep -c $'\x0c' filename

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

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

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

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

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