
Я ищу определенные строки в исполняемых файлах (Windows).
Сначала я начал с
grep -a string file
поскольку это обрабатывает двоичные файлы как текстовые. Проблема в том, что нет аккуратного вывода, разрывы строк происходят случайно (когда правильные байты идут в порядке) и т. д.
Поэтому я подумал, что воспользуюсь строками:
strings file | grep -i string
К моему удивлению, 'strings' не находит строки, которые я смог найти с помощью 'grep -a'. Однако 'strings' хорош тем, что выводит каждый элемент того, что находит, на новой строке.
Как мне получить лучшее из обоих миров? То есть я хочу действительно найти все, а также получить разумный вывод того, что было найдено.
решение1
Это strings
не находит те же шаблоны, что и ваша строка, скорее всего, вызвано strings
поиском шаблонов длиной не менее 4 символов.иза которым следует непечатаемый символ. Из man strings
для GNU strings
:
For each file given, GNU strings prints the printable character
sequences that are at least 4 characters long (or the number given
with the options below) and are followed by an unprintable character.
Кроме того, strings
по умолчанию сканируются только инициализированные и загруженные разделы объектных файлов, что может еще больше сократить количество выводимых строк.
Вы можете попробовать параметры -a
и -n
, чтобы изменить это поведение:
strings -n 1 -a file | grep -i string
Это должно дать вам больше струн и, вероятно, все, чего вы ожидаете.
Разница в выводе моего python
исполняемого файла:
$ strings $(which python) | wc
31923 68075 474068
$ strings -n 1 $(which python) | wc
501231 531837 1541204
$ strings -n 1 -a $(which python) | wc
501398 531995 1541762
решение2
Почему нет:
grep -a string file | strings
strings
печатает последовательности печатаемых символов длиной не менее 4 символов. Поэтому если вам grep
нужно что-то короче 4 символов, обработка через strings
first приведет к его пропуску. Используйте strings -n 1
для установки минимальной длины в 1.