Python相当于unix"strings"实用程序

jos*_*hlf 11 python string executable

我正在尝试编写一个脚本,它将从可执行二进制文件中提取字符串并将其保存在文件中.将此文件换行换行不是一种选择,因为字符串本身可能有换行符.但是,这也意味着使用unix"strings"实用程序不是一个选项,因为它只打印出所有新行分隔的字符串,这意味着只能通过查看输出来判断哪些字符串包含换行符. "弦".因此,我希望找到一个python函数或库,它实现了"strings"的相同功能,但它会将这些字符串作为变量,这样我就可以避免换行问题.

谢谢!

Zer*_*eus 18

这是一个生成器,它生成所有可打印字符的字符串> = 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
Run Code Online (Sandbox Code Playgroud)

您可以迭代:

for s in strings("something.bin"):
    # do something with s
Run Code Online (Sandbox Code Playgroud)

...或存储在列表中:

sl = list(strings("something.bin"))
Run Code Online (Sandbox Code Playgroud)

我已经对此进行了非常简单的测试,它似乎为strings我选择的任意二进制文件提供了与Unix 命令相同的输出.但是,它非常天真(一开始,它会立即将整个文件读入内存,这对于大型文件来说可能很昂贵),并且不太可能接近Unix strings命令的性能.


Syl*_*oux 6

引用man strings

STRINGS(1) GNU 开发工具 STRINGS(1)

姓名
       字符串 - 在文件中打印可打印字符的字符串。

[...]
描述
       对于给定的每个文件,GNU 字符串打印可打印字符
       长度至少为 4 个字符的序列(或用
       下面的选项),后跟一个不可打印的字符。经过
       默认情况下,它只打印初始化和加载的字符串
       目标文件的部分;对于其他类型的文件,它会打印
       整个文件中的字符串。

您可以通过使用匹配的至少 4 个可打印字符来获得类似的结果regex。类似的东西:

>>> import re

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

请注意,此解决方案需要将整个文件内容加载到内存中。

  • 您还可以使用 [ -~]{4,} 获得相同的结果 (3认同)