Python-эквивалент утилиты unix "strings"

python string executable

8380 просмотра

2 ответа

11577 Репутация автора

Я пытаюсь написать скрипт, который будет извлекать строки из исполняемого двоичного файла и сохранять их в файл. Наличие этого файла, разделенного символом новой строки, не вариант, так как строки могут иметь новые строки. Это также означает, однако, что использование утилиты unix «strings» не является опцией, так как она просто печатает все строки, разделенные символом новой строки, то есть нет никакого способа сказать, в какие строки включены строки перевода, просто посмотрев на результат «струна». Таким образом, я надеялся найти функцию или библиотеку python, которая реализует ту же функциональность «строк», но которая даст мне эти строки в качестве переменных, чтобы я мог избежать проблемы с новой строкой.

Спасибо!

Автор: joshlf Источник Размещён: 19.06.2013 03:59

Ответы (2)


3 плюса

38153 Репутация автора

Цитировать man strings:

STRINGS (1) Средства разработки GNU STRINGS (1)

ИМЯ
       strings - печатать строки печатаемых символов в файлах.

[...]
ОПИСАНИЕ
       Для каждого заданного файла в строках GNU печатается печатный символ
       последовательности длиной не менее 4 символов (или число, указанное с
       варианты ниже) и сопровождаются непечатаемым символом. По
       по умолчанию, он печатает только строки из инициализированного и загруженного
       разделы объектных файлов; для других типов файлов он печатает
       строки из всего файла.

Вы можете достичь аналогичного результата, используя regexне менее 4 печатаемых символов. Что-то вроде того:

>>> import re

>>> content = "hello,\x02World\x88!"
>>> re.findall("[^\x00-\x1F\x7F-\xFF]{4,}", content)
['hello,', 'World']

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

Автор: Sylvain Leroux Размещён: 19.06.2013 04:28

18 плюса

34211 Репутация автора

Вот генератор, который возвращает все строки печатаемых символов> = min(по умолчанию 4), в которых он находит filename:

import string

def strings(filename, min=4):
    with open(filename, errors="ignore") as f:  # Python 3.x
    # with open(filename, "rb") as f:           # Python 2.x
        result = ""
        for c in f.read():
            if c in string.printable:
                result += c
                continue
            if len(result) >= min:
                yield result
            result = ""
        if len(result) >= min:  # catch result at EOF
            yield result

Что вы можете перебрать:

for s in strings("something.bin"):
    # do something with s

... или хранить в списке:

sl = list(strings("something.bin"))

Я проверил это очень кратко, и, похоже, он дает тот же вывод, что и команда Unix stringsдля произвольного двоичного файла, который я выбрал. Тем не менее, это довольно наивно (для начала, он читает весь файл в память сразу, что может быть дорого для больших файлов), и очень маловероятно, чтобы приблизиться к производительности команды Unix strings.

Автор: Zero Piraeus Размещён: 19.06.2013 04:55
Вопросы из категории :
32x32