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命令的性能.
引用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)
请注意,此解决方案需要将整个文件内容加载到内存中。
| 归档时间: |
|
| 查看次数: |
8480 次 |
| 最近记录: |