有神秘档案吗?Linux file命令将快速告诉您它是什么类型的文件。如果它是一个二进制文件,你可以找到更多关于它。文件里有一大堆马厩,可以帮你分析。我们将向您展示如何使用这些工具。
文件通常具有一些特性,允许软件包识别它是哪种类型的文件,以及其中的数据表示什么。尝试在MP3音乐播放器中打开PNG文件是没有意义的,因此文件携带某种形式的ID既有用又实用。
这可能是文件开头的几个签名字节。这允许文件明确其格式和内容。有时,文件类型是从数据本身内部组织的一个独特方面推断出来的,称为文件体系结构。
有些操作系统,如Windows,完全由文件扩展名引导。您可以称之为轻信或信任,但Windows假定任何具有DOCX扩展名的文件实际上都是DOCX字处理文件。Linux不是那样的,你很快就会看到。它需要证据并在文件中查找。
这里描述的工具已经安装在我们用来研究本文的manjaro20、fedora21和ubuntu20.04发行版上。我们用文件命令开始调查吧。
我们在当前目录中有一个不同文件类型的集合。它们是文档、源代码、可执行文件和文本文件的混合体。
ls命令将显示目录中的内容,-hl(人类可读大小,长列表)选项将显示每个文件的大小:
ls -hl让我们试试这些文件,看看我们得到了什么:
file build_instructi***.odt file build_instructi***.pdf file COBOL_Report_Apr60.djvu正确识别了这三种文件格式。在可能的情况下,文件给了我们更多的信息。据报道,PDF文件为1.5版格式。
即使我们将ODT文件重命名为具有任意值XYZ的扩展名,在文件浏览器和使用file的命令行中,仍然可以正确识别该文件。
在文件浏览器中,它被赋予了正确的图标。在命令行上,file忽略扩展名并查看文件内部以确定其类型:
file build_instructi***.xyz使用媒体上的文件(如图像和音乐文件)通常会产生有关其格式、编码、分辨率等的信息:
file screenshot.png file screenshot.jpg file Pachelbel_Canon_In_D.mp3有趣的是,即使是纯文本文件,file也不会根据扩展名来判断文件。例如,如果您有一个扩展名为“.c”的文件,其中包含标准纯文本,但不包含源代码,则该文件不会将其误认为是真正的c源代码文件:
file function+headers.h file makefile file hello.c文件将头文件(“.h”)正确地标识为文件的C源代码集合的一部分,并且它知道makefile是一个脚本。
二进制文件比其他文件更像一个“黑匣子”。可以通过适当的软件包查看图像文件、播放声音文件和打开文档文件。不过,二进制文件更具挑战性。
例如,文件“hello”和“wd”是二进制可执行文件。它们是程序。名为“wd.o”的文件是一个对象文件。当编译器编译源代码时,会创建一个或多个目标文件。这些包含计算机在完成的程序运行时最终将执行的机器代码,以及链接器的信息。链接器检查每个对象文件中对库的函数调用。它将它们链接到程序使用的任何库。这个过程的结果是一个可执行文件。
“文件”监视.exe“是已交叉编译以在Windows上运行的二进制可执行文件:
file wd file wd.o file hello file watch.exe先拿最后一个,文件告诉我们监视.exe“文件是一个PE32+可执行控制台程序,用于Microsoft Windows上的x86系列处理器。PE代表可移植可执行格式,它有32位和64位版本。PE32是32位版本,PE32+是64位版本。
其他三个文件都被标识为可执行和可链接格式(ELF)文件。这是可执行文件和共享对象文件(如库)的标准。我们将很快了解ELF头格式。
您可能会注意到,这两个可执行文件(“wd”和“hello”)被标识为Linux标准基(LSB)共享对象,而对象文件“wd.o”被标识为LSB可重定位文件。“可执行文件”这个词显然不存在。
对象文件是可重定位的,这意味着其中的代码可以在任何位置加载到内存中。可执行文件被列为共享对象,因为它们是由链接器从对象文件创建的,这样它们就继承了这个功能。
这允许地址空间布局随机化(ASMR)系统将可执行文件加载到其选择的地址的内存中。标准可执行文件的头文件中有一个加载地址编码,该地址指示将它们加载到内存中的位置。
ASMR是一种安全技术。将可执行文件以可预测的地址加载到内存中,使它们容易受到攻击。这是因为攻击者总是知道它们的入口点和函数的位置。定位在随机地址的独立可执行文件(PIE)克服了这种敏感性。
如果我们用gcc编译器编译程序并提供-no-pie选项,我们将生成一个常规的可执行文件。
-o(输出文件)选项允许我们为可执行文件提供名称:
gcc -o hello -no-pie hello.c我们将在新的可执行文件上使用文件,并查看发生了什么变化:
file hello可执行文件的大小与以前相同(17 KB):
ls -hl hello二进制文件现在被标识为标准可执行文件。我们这样做只是为了演示。如果这样编译应用程序,您将失去ASMR的所有优点。
我们的示例hello程序是17kb,所以它很难被称为big,但是,一切都是相对的。源代码为120字节:
cat hello.c如果它只需要在终端窗口中打印一个字符串,那么二进制文件的扩展是什么呢?我们知道有一个ELF头,但是对于一个64位二进制文件来说只有64字节长。很明显,这肯定是另外一回事:
ls -hl hello让我们用strings命令扫描二进制文件,作为发现其中内容的简单第一步。我们将把它输送到更少的地方:
strings hello | less二进制文件中除了“你好,极客世界!“从我们的源代码。其中大部分是二进制文件中区域的标签,以及共享对象的名称和链接信息。这些库包括二进制文件所依赖的库和这些库中的函数。
ldd命令显示二进制文件的共享对象依赖关系:
ldd hello输出中有三个条目,其中两个包含目录路径(第一个不包含):
我们可以使用readelf实用程序和-h(文件头)选项检查并解码ELF头:
readelf -h hello标题为我们解释。
所有ELF二进制文件的第一个字节被设置为十六进制值0x7F。接下来的三个字节被设置为0x45、0x4C和0x46。第一个字节是将文件标识为ELF二进制文件的标志。为了清楚地说明这一点,接下来的三个字节用ASCII码拼写出“ELF”:
其他条目是二进制文件中区域和部分的大小和数量,因此可以计算它们的位置。
使用hexdump快速查看二进制文件的前8个字节,将显示文件前4个字节中的签名字节和“ELF”字符串。-C(canonical)选项为我们提供字节的ASCII表示及其十六进制值,-n(number)选项让我们指定要查看的字节数:
hexdump -C -n 8 hello如果您想查看细节,可以使用objdump命令和-d(反汇编)选项:
objdump -d hello | less这将反汇编可执行的机器代码,并以十六进制字节与汇编语言等价物一起显示。每行中第一个bye的地址位置显示在最左边。
只有当你能读懂汇编语言,或者你好奇幕后发生了什么时,这才有用。有很多输出,所以我们把它输送到更少的地方。
有许多方法可以编译二进制文件。例如,开发人员选择是否包含调试信息。二进制文件的链接方式也影响其内容和大小。如果二进制引用将对象作为外部依赖项共享,那么它将小于依赖项静态链接到的对象。
大多数开发人员已经知道我们在这里介绍的命令。不过,对于其他人来说,它们提供了一些简单的方法来翻查二进制黑盒中的内容。
...例中,我使用了文档转换器Pandoc。它包括/usr/local/bin中的二进制文件和/usr/local/share/man中的一些文档。这些东西到底是如何到位的?我们来看看每一个都是如何安装到你的Mac上的。 ...
...,你的计算机把所有东西都看成是1s,或者是众所周知的二进制代码或机器代码。 ...
Linux seq命令可以在眨眼之间生成数字列表。但是如何将这个功能付诸实际使用呢?我们将向您展示seq如何为您带来便利。 seq命令 乍一看,Linux seq命令似乎有些奇怪。它可以让你快速生成数字序列,就这样!不过,这里的关键...
...他内容混合的命令名。然后,它会找到这些命令的可执行二进制文件,并使用您提供的参数启动它们。 shell定位可执行文件的第一步是确定是否包含二进制文件。如果您使用的命令位于shell本身(“shell内置”)中,则无需进一...
...我有一半希望其中一个是另一个的别名,但它们是不同的二进制文件。 type deluser type userdel 尽管两者都可用,但建议在Debian衍生发行版上使用deluser: “userdel是一个用于删除用户的低级实用程序。在Debian上,管理员通常应该改...
...读取大量文本、无穷无尽的字符串和未格式化的流。学习如何。 linux终端中文本行的工作原理 Linux战斗的第一条规则:了解你的敌人。让我们来定义它。一行文字到底是什么?它是由字母、数字、符号和空格组成的一系列字符...
...的、专用的日志解决方案收集和管理。它们存储的格式是二进制的。这有助于以不同的格式提取数据,如我们将看到的JSON。 它还可以更容易地交叉引用以前记录在单独日志文件中的相关信息。因为数据现在保存在一个单独的日...
...格式。在systemd下,它们不再以纯文本形式创建,而是以二进制格式记录。要读取这些日志文件,必须使用journactl实用程序。tail命令适用于纯文本格式。它不读取二进制文件。那么,这是否意味着tail命令是寻找问题的解决方案呢...
...,而且您不必记住一组晦涩难懂的命令行选项。 相关:如何使用ls命令列出Linux上的文件和目录 快速比较 让我们使用ls给出一个长列表(-l选项),其中包含人类可读的文件大小(-h选项): ls -lh ana.h 从左到右,ls提供的信息是...
Linux which命令标识在向shell发出命令时启动的可执行二进制文件。如果您的计算机上有同一程序的不同版本,您可以使用哪个来确定shell将使用哪个版本。 二进制文件和路径 当您试图从终端窗口运行程序或命令时,shell(通常是...