要查看二进制文件或数据文件中的文本吗?Linux strings命令为您提取那些称为“strings”的文本。
Linux充满了看起来像是解决问题的解决方案的命令。弦乐司令部肯定属于那个阵营。它的目的是什么?是否有指向列出二进制文件中可打印字符串的命令的点?
让我们后退一步。诸如程序文件之类的二进制文件可以包含人类可读文本的字符串。但是你怎么才能看到他们呢?如果你使用cat或更少,你很可能会以一个悬挂终端窗口结束。如果将不可打印的字符输入到文本文件中,则设计用于处理文本文件的程序无法很好地处理这些文件。
二进制文件中的大部分字节不是人类可读的,不能以任何有意义的方式打印到终端窗口。没有与字母数字字符、标点符号或空格不对应的字符或标准符号来表示二进制值。这些字符统称为“可打印”字符。其余为“不可打印”字符。
因此,试图在二进制文件或数据文件中查看或搜索文本字符串是一个问题。这就是弦的作用。它从文件中提取可打印字符的字符串,以便其他命令可以使用这些字符串,而不必与不可打印字符竞争。
strings命令并不复杂,它的基本用法非常简单。我们在命令行中提供希望字符串搜索的文件名。
在这里,我们将在一个二进制文件上使用字符串,一个叫做“jibber”的可执行文件。
strings jibber字符串从文件中提取并在终端窗口中列出。
默认情况下,字符串将搜索四个字符或更长的字符串。要设置更长或更短的最小长度,请使用-n(最小长度)选项。
注意,最小长度越短,你看到更多垃圾的几率就越高。
某些二进制值与表示可打印字符的值具有相同的数值。如果其中两个数值恰好并排出现在文件中,并且您指定的最小长度为2,那么这些字节将被报告为一个字符串。
要要求字符串使用2作为最小长度,请使用以下命令。
strings -n 2 jibber我们现在有两个字母字符串包含在结果中。请注意,空格被计算为可打印字符。
由于字符串输出的长度,我们将通过更少的管道。然后我们可以在文件中滚动查找感兴趣的文本。
strings jibber | less清单现在以较少的形式呈现给我们,首先显示清单的顶部。
通常,程序源代码文件被编译成目标文件。这些文件与库文件链接以创建二进制可执行文件。我们手头有jibber对象文件,所以让我们看看这个文件。请注意“.o”文件扩展名。
jibber.o | less如果第一组字符串的长度超过8个字符,则它们将全部包装在第8列。如果它们已被包装,则第九列中有一个“H”字符。您可以将这些字符串识别为SQL语句。
滚动输出会发现文件中没有使用这种格式。
有趣的是,可以看到目标文件和完成的可执行文件之间文本字符串的差异。
编译程序内部有不同的区域用于存储文本。默认情况下,字符串搜索整个文件以查找文本。这就像您使用了-a(all)选项一样。要使字符串只在文件中已初始化、已加载的数据节中搜索,请使用-d(data)选项。
strings -d jibber | less除非您有充分的理由这样做,否则最好使用默认设置并搜索整个文件。
我们可以让字符串打印从每个字符串所在的文件开始的偏移量。为此,请使用-o(offset)选项。
strings -o parse_phrases | less偏移量以八进制表示。
要以不同的数字基(如十进制或十六进制)显示偏移量,请使用-t(基数)选项。基数选项必须后跟d(十进制)、x(十六进制)或o(八进制)。使用-to和使用-o是一样的。
strings -t d parse_phrases | less偏移量现在以十进制打印。
strings -t x parse_phrases | less偏移量现在以十六进制打印。
字符串将制表符和空格字符视为它找到的字符串的一部分。其他空白字符(如换行符和回车符)不会被视为字符串的一部分。-w(whitespace)选项使字符串将所有空白字符视为字符串的一部分。
strings -w add_data | less我们可以看到输出中的空白行,这是第二行结尾的(不可见)回车符和换行符的结果。
我们可以将字符串用于任何可以产生字节流的东西。
通过这个命令,我们可以查看计算机的随机存取存储器(RAM)。
我们需要使用sudo,因为我们正在访问/dev/mem。这是一个字符设备文件,其中包含计算机主内存的图像。
sudo strings /dev/mem | less清单并不是RAM的全部内容。它只是可以从中提取的字符串。
相关:在Linux中,“一切都是文件”是什么意思?
通配符可用于选择要搜索的文件组。*字符表示多个字符,而?字符表示任何单个字符。您还可以选择在命令行中提供许多文件名。
我们将使用通配符搜索/bin目录中的所有可执行文件。因为清单将包含许多文件的结果,所以我们将使用-f(filename)选项。这将打印每行开头的文件名。然后我们可以看到每个字符串在哪个文件中找到。
我们正在通过grep管道传输结果,并寻找包含“Copyright”一词的字符串
strings -f /bin/* | grep Copyright我们得到了/bin目录中每个文件的版权声明的整洁列表,文件名位于每行的开头。
字符串并不神秘;它是一个典型的Linux命令。它做了一些非常具体的事情,做得非常好。
它是Linux的另一个核心,当它与其他命令一起工作时,它就真正地出现了。当您看到它如何位于二进制文件和其他工具(如grep)之间时,您就开始了解这个稍微晦涩难懂的命令的功能了。
...这些服务提供了一个集中的目录。在本文中,我们将学习如何实现一个服务器来公开对象,以及如何实现一个客户端来调用服务器上的方法,以及如何在RMI注册表中注册和查找服务。 ...
... 在本文中,我将向您展示如何在Linux上安装、运行和使用PowerShell! ...
... 在这里,您将了解什么是crontab,如何添加自动化作业,以及一些实际示例。 ...
Linux seq命令可以在眨眼之间生成数字列表。但是如何将这个功能付诸实际使用呢?我们将向您展示seq如何为您带来便利。 seq命令 乍一看,Linux seq命令似乎有些奇怪。它可以让你快速生成数字序列,就这样!不过,这里的关键...
...。文件里有一大堆马厩,可以帮你分析。我们将向您展示如何使用这些工具。 识别文件类型 文件通常具有一些特性,允许软件包识别它是哪种类型的文件,以及其中的数据表示什么。尝试在MP3音乐播放器中打开PNG文件是没有...
需要识别Linux计算机中的图形处理单元(GPU)吗?下面是如何从命令行和GNOME中识别图形卡。 第一步 你可能去过那里。你被征召来为一个非技术性的亲戚或同事提供支持,有些事情告诉你这不是无痛的。不过,你还是加入了!...
...我们将向您展示哪些字符是“特殊”或“元”字符,以及如何从功能和字面上使用它们。 ~主目录 波浪号(~)是主目录的缩写。这意味着您不必在命令中键入主目录的完整路径。在文件系统中的任何位置,都可以使用此命令转...
...定的命令,它将默认使用echo。 我们可以用它来演示xargs如何总是生成一行输出,即使是从多行输入。 如果将-1(每行列出一个文件)选项与ls一起使用,则会得到一列文件名。 ls -1 ./*.sh 这将列出当前目录中的shell脚本文件。 ...