您是否想要查看二进制文件或数据文件中隐藏的文本信息?Linux的 strings
命令可以帮助您提取出这些被称为“字符串”的可读文本。
Linux系统提供了众多解决问题的命令,strings
命令便是其中之一。那么,它的具体用途是什么呢?是否存在一个命令可以列出二进制文件中所有可打印的文本字符串呢?
让我们先了解一下背景知识。二进制文件,例如程序文件,可能包含人类可以阅读的文本字符串。但是,我们如何才能看到它们呢?如果直接使用 cat
或 less
命令,可能会导致终端窗口卡住。这是因为专为文本文件设计的程序,在遇到不可打印的字符时,无法正常工作。
二进制文件中的大多数字节并不是人类可读的,它们无法以任何有意义的方式在终端窗口中显示。由于没有字符或标准符号来表示那些与字母数字字符、标点符号或空格不对应的二进制值,因此,我们将这些字符称为“不可打印”字符。而其余的字符则被视为“可打印”字符。
因此,直接在二进制文件或数据文件中查看或搜索文本字符串会遇到困难。而 strings
命令正是为了解决这个问题而出现的。它能够从文件中提取出可打印的字符串,以便其他命令能够使用这些字符串,而不必处理那些不可打印的字符。您可以通过这个链接了解更多关于strings
命令的信息。
如何使用 strings 命令
strings
命令的使用非常简单,基本操作并不复杂。 我们只需要在命令行中提供我们想要搜索字符串的文件的名称即可。
例如,我们将在一个名为“jibber”的二进制可执行文件上使用 strings
命令。我们只需输入 strings jibber
,然后按下Enter键即可开始。
strings jibber
该命令会从指定的文件中提取字符串,并在终端窗口中列出它们。
设置最小字符串长度
默认情况下,strings
命令会搜索长度为四个字符或更长的字符串。要设置更长或更短的最小长度,可以使用 -n
(最小长度) 选项。
请注意,最小长度越短,您看到“垃圾”字符串的可能性就越大。
有些二进制值可能与表示可打印字符的值相同。如果这些值恰好在文件中相邻排列,并且您指定的最小长度为两个字符,那么这些字节会被误认为是字符串。
要让 strings
命令使用两个字符作为最小长度,请使用以下命令:
strings -n 2 jibber
现在,结果中包含长度为两个字符的字符串。请注意,空格也被视为可打印字符。
使用 less 命令分页查看字符串
由于 strings
命令的输出可能会很长,我们可以将其通过管道传递给 less
命令,以便分页查看。这样,我们可以滚动浏览文件,找到我们感兴趣的文本。
strings jibber | less
现在,输出列表以分页形式显示,首先显示列表顶部的内容。
对目标文件使用 strings 命令
通常,程序源代码文件会被编译成目标文件。这些目标文件会与库文件链接,以创建最终的可执行二进制文件。我们这里有一个名为 “jibber” 的目标文件,让我们看看它的内部。请注意,目标文件通常以 “.o” 作为文件扩展名。
strings jibber.o | less
如果第一组字符串的长度超过八个字符,它们都会在第 8 列换行。如果它们换行了,“H”字符将在第九列显示。您可以识别出这些字符串是 SQL 语句。
滚动输出,您会发现这种格式并没有在整个文件中保持一致。
观察目标文件和最终的可执行文件之间的文本字符串差异,是一件有趣的事情。
在文件的特定区域搜索
编译后的程序内部有不同的区域用于存储文本。默认情况下,strings
命令会搜索整个文件以查找文本。这相当于使用了 -a
(all) 选项。要仅在文件中已初始化、已加载的数据部分中搜索字符串,请使用 -d
(data) 选项。
strings -d jibber | less
除非您有特别的理由,否则使用默认设置搜索整个文件通常更方便。
打印字符串的偏移量
我们可以让 strings
命令打印每个字符串在文件中的偏移量,也就是从文件开头到字符串开始位置的字节数。为此,请使用 -o
(offset) 选项。
strings -o parse_phrases | less
偏移量以八进制表示。
要以不同的数字基数显示偏移量,例如十进制或十六进制,请使用 -t
(基数) 选项。 radix
选项后面必须跟 d
(十进制), x
(十六进制) 或 o
(八进制)。使用 -to
与使用 -o
相同。
strings -t d parse_phrases | less
现在,偏移量以十进制打印。
strings -t x parse_phrases | less
偏移量现在以十六进制打印。
包含空格
strings
命令将制表符和空格字符视为找到的字符串的一部分。其他空白字符,例如换行符和回车符,通常不被视为字符串的一部分。-w
(whitespace) 选项会使 strings
命令将所有空白字符都视为字符串的一部分。
strings -w add_data | less
我们可以在输出中看到空白行,这是由于第二行末尾的回车符和换行符 (不可见) 造成的。
strings 命令不仅仅限于文件
我们可以将 strings
命令与任何可以产生字节流的资源一起使用。
使用此命令,我们可以查看计算机的随机访问存储器 (RAM)。
我们需要使用 sudo
,因为我们正在访问 /dev/mem
。这是一个字符设备文件,其中包含计算机主存储器的映像。
sudo strings /dev/mem | less
此列表并非您 RAM 中的全部内容。它只是可以从中提取的字符串。
一次搜索多个文件
通配符可以用来选择要搜索的文件组。 *
字符表示多个字符,而 ?
字符表示任何单个字符。您也可以在命令行上直接提供多个文件名。
我们将使用通配符并搜索 /bin
目录中的所有可执行文件。因为列表将包含许多文件的结果,我们将使用 -f
(文件名) 选项。这会在每行的开头打印文件名。这样我们就可以看到每个字符串是在哪个文件中找到的。
我们将结果通过管道传递给grep命令,并查找包含 “Copyright” 一词的字符串。
strings -f /bin/* | grep Copyright
我们得到一个简洁的列表,列出了 /bin
目录中每个文件的版权声明,文件名位于每行的开头。
总结
strings
命令并不神秘;它是一个典型的 Linux 命令,专门执行一项非常具体的任务,并且做得很好。
它是 Linux 工具链中另一个关键的齿轮,当它与其他命令结合使用时,它才能真正发挥作用。当你看到它是如何与其他工具(例如 grep
命令)一起工作时,您会开始体会到这个看似不太起眼的命令的强大功能。