我正在(Windows)可执行文件中寻找某些字符串。
首先我开始于
grep -a string file
因为它将二进制文件视为文本文件。问题是没有整齐的输出,换行符偶然发生(当正确的字节按顺序出现时)等。
所以我想我应该使用字符串:
strings file | grep -i string
令我惊讶的是,“strings”找不到我使用“grep -a”找到的字符串。然而,“字符串”的优点在于它可以输出在新行中找到的所有内容的每一项。
我如何才能两全其美?这意味着我想真正找到所有内容,并获得所发现内容的合理输出。
答案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
首先通过 via 处理将导致它丢失。用于strings -n 1
将最小长度设置为 1。