7

У меня есть бинарный файл, подобный этому (открытый в шестнадцатеричном режиме Emacs ): Как я могу выполнить grep, если в файле существуют шестнадцатеричные значения '22081b00081f091d2733170d123f3114?

00000000: 2b08 1b00 1418 0825 0407 3830 271d 170d  +......%..80'...
00000010: 2208 1b00 081f 091d 2733 170d 123f 3114  ".......'3...?1.
00000020: 1909 1b00 0934 1f10 2503 3803 111c 3821  .....4..%.8...8!

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

3 ответа3

7

Ты можешь использовать:

xxd -p /your/file | tr -d '\n' | grep -c '22081b00081f091d2733170d123f3114'

Если содержимое совпадает, будет возвращено 1, в противном случае - 0.

xxd -p преобразует файл в обычный шестнадцатеричный дамп, tr -d '\n' удаляет символы новой строки, добавленные xxd , а grep -c подсчитывает количество совпавших строк.

Таким образом, ввод сопоставляется с любой его позицией в файле (если бы он был в позиции 0x18 в вашем примере, он был бы разрезан на две части, и grep не совпал бы с ним без использования tr). Тем не менее, у вас нет своей позиции в файле.

2

С последующими greps вы можете определенно выполнять поиск шестнадцатеричных строк и многое другое. Вы можете сделать это с полной силой регулярного выражения (регулярное выражение), например, «найдите мне эту шестнадцатеричную последовательность, за которой следует 1 или более 0 а затем текст, соответствующий этому и этому регулярному выражению».

grep -aPo '\x01\x00\x00\x00[0-z]+\x00\x00\x00[0-z]+' <file>

сопоставляет пары логин / пароль в файле с двоичным дампом потока протокола, используемого для управления и поиска видео в формате DHAV в некоторых системах IP-DVR. То есть соответствующий элемент должен иметь байты с шестнадцатеричными кодами 0x01 0x00 0x00 0x00 за которыми следует ASCII-логин, затем 0x00 , еще два 0 байта и затем пароль.

0

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

Одним из решений будет использование od для преобразования двоичного файла в шестнадцатеричный и вывода его в ASCII, который затем можно передать в grep для поиска шестнадцатеричной строки:

od -t x -A n <input_file> | grep <hex string>

Тем не менее, это вызывает дополнительные проблемы, потому что он вставляет новые строки и пробелы для форматирования гекса. Чтобы справиться с этим, вы можете попробовать использовать sed .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .