Найти последовательность байтов в очень большом файле, используя Python - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу найти следующую последовательность байтов в очень большом файле (размер файла больше 2 ГБ) и распечатать 100 байтов сразу после этой последовательности байтов.

0x77 0x??{6-8} 0x78 0x07 0x??{18} 0x87 0x0d 0x00{2}

Обновление: {6-8} обозначает квантификатор.

Это похоже на сигнатуру байта.Обычно я бы использовал Yara для поиска таких байтовых сигнатур в файле.Очевидно, Yara не обрабатывает очень большие файлы должным образом.

Здесь, ??представляет собой символ подстановки, поэтому он может соответствовать любому байту.

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

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

Возможно, мне нужноизменить и использовать какой-то тип регулярного выражения?

Спасибо.

1 Ответ

0 голосов
/ 08 декабря 2018

Если ваша оболочка - Bash (или другая оболочка, которая поддерживает $'...' строки в стиле C), а grep - это GNU grep (как это, очевидно, есть), и если я могу правильно угадать, чтоВаше специальное представление шаблона поиска должно представлять, попробуйте

grep -obUaP $'\x77.{6,8}\x78\x07.{18}\x87\x0d\x00{2}\K.{100}' file

, где . соответствует любому байту, {m,n} говорит, что повторяет непосредственно предшествующий шаблон по крайней мере m и самое большееn раз, один {n} повторяет что-то ровно n раз, а последовательности \xab представляют один байт в шестнадцатеричной записи.K говорит, что соответствует всему выражению, но печатает часть только после \K (очевидно, уберите это, если вы действительно хотите напечатать часть подписи тоже).

Однако, потому что в вашем паттерне есть и \x00, и \x0d, я не думаю, что это сработает.Если в вашем паттерне есть только один из них, вы можете использовать либо -z (читать «строку» до следующего нулевого байта), либо перейти к вводу по умолчанию, ориентированному на строку.Если ваши последовательности «что-нибудь» никогда не могут содержать нулевые байты, вы можете временно заменить нулевые байты на (скажем) \xfe и наоборот:

tr `\376\000' '\000\376' <file | grep ...

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

Или вы могли бы сломаться и сделать это в Python в конце концов.Чтение буфера (скажем, 8192 байта) за раз, поиск шаблона в этой байтовой строке, затем сохранение последних 100 с лишним байтов из предыдущего чтения и добавление следующего буфера в сохраненную последовательность, затем цикл до eof.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...