二进制文件之谜

二进制文件之谜

这是关于直接来自编译器的文件,例如 g++ 和-o(outfile) 标志。

如果它们是二进制的,它们不应该只是一堆 0 和 1 吗?

当你捕捉它们时,你会得到难以理解的输出,但也会得到完整的单词。

如果你把它们归档,你会立即得到答案——似乎没有计算。二进制文件实际上是否具有包含此类信息的标头?

我认为二进制可执行文件只是刚刚编译的程序,只是以机器指令的形式,CPU 可以立即、明确地理解。如果是这样,那指令集不就是位模式吗?但是,二进制文件中的其他内容是什么?如何显示这些位?

另外,如果您以某种方式掌握了处理器的手册,您可以手动编写二进制文件,一次一个机器指令吗?这将是非常无效的,但是非常如果你能让它工作,即使是“Hello World!”,这也是很有趣的。演示。

答案1

这个超级用户问题:当您使用文本编辑器打开二进制文件时,为什么看不到二进制代码?很好地解决了你的第一点。

二进制和文本数据没有分开:它们只是数据。这取决于使它们成为其中之一的解释。如果您在文本编辑器中打开二进制数据(例如图像文件),其中大部分数据将没有意义,因为它不符合您选择的解释(作为文本)。

文件以零和一的形式存储(例如,存储器上有电压/无电压、硬盘驱动器上有磁化/无磁化)。读取文件时看不到零和一,cat因为 0/1 序列对人类来说没有多大用处;字符更有意义,并且十六进制转储更适合大多数用途(尝试hexdump使用文件)。

可执行文件有标题它描述了参数,例如构建程序的体系结构以及文件的哪些部分是代码和数据。这是file用来识别二进制文件的特征的。

最后:是的,您可以直接使用 CPU 操作码以汇编语言编写程序。看一眼UNIX 汇编编程简介英特尔 x86 文档为起点。

答案2

所有文件都存储为 1 和 0,cat 只是尝试将每个 BYTE(8 位)解释为一个字符,这就是为什么您会看到无法理解的字符。

答案3

所有文件在底层都是二进制的:它们存储为一系列

文件的位实际上分组在字节。每个文件都由整数个字节组成。所有 UNIX 系统,实际上几乎所有计算机,都有由 8 位组成的字节(称为八位位组在网络术语中)。有一种自然的方式将字节解释为 8 位数字,即 0 到 2 8 -1 = 255 之间的数字。

要将它们视为二进制,您需要一个以二进制表示法写出它们的工具。人类不太适合二进制表示法:写任何东西都需要很长时间。比较常用的是十六进制符号,有 16 个不同的数字。例如,41(十六进制的 65)比01000001(二进制的 65)读起来更舒服。您可以使用诸如od(“八进制转储”)或hexdumphd列出每个字节具有八进制或十六进制表示法的文件(od -t x1切换到十六进制)。

字节可以代表字符。有几个字符编码在 UNIX 世界中使用。它们都是基于ASCII码,它定义了 0 到 127 之间字​​节的解释。请注意,这仅定义了一半可能字节值的含义。例如,65代表大写字母A,97代表小写字母a,30代表数字0,依此类推。有些字符编码用一个字节来表示每个字符;例如,在拉丁语1编码,163代表£,241代表ñ等等。这种方式最多可以表示 256 个字符,这个数字并不多;因此,还有其他编码每个字符使用多个字节。当今unix世界事实上的标准编码是UTF-8,这是一种变长编码(不同的字符占用不同的字节数)统一字符集

文本文件是恰好包含可理解文本的二进制文件。事实上,对于 UNIX 程序来说,只要满足两个条件,文件就是文本文件:

  • 文本文件不能包含任何空字节(数值为 0 的字节)。该字节不代表任何字符,在许多文本操作程序内部用作特殊标记。
  • 文本文件由一系列行组成,每行以新队字符(其数值为 10)。

机器可执行文件是一种特殊类型的二进制文件。如果您cat对它们运行命令,您会看到一些垃圾,其中偶尔会有一些文本。这些文件也可能碰巧包含适用于您的终端的命令。您可以使用该程序strings查看二进制文件中的所有文本片段,忽略不可打印的字符。

机器可执行文件并不完全是机器指令序列:它们还包含一些额外信息,告诉操作系统如何将文件加载到内存中,通常还包含程序使用的一些数据,以及可选的调试信息。大多数 UNIX 系统使用极低频机器可执行文件的格式。此格式指定如何将包含机器代码的文件分为多个部分,并且该部分独立于机器体系结构;有些部分包含代码,并且该代码的含义特定于特定的机器体系结构。

您可以使用该命令objdump -D /path/to/machine-executable以人类可读的形式显示可执行文件的列表:汇编语言。好吧,无论如何,受过训练的人都可以阅读。汇编语言特定于处理器体系结构并直接映射到机器指令。

用汇编语言编写完整的程序是可能的,但对于重要的程序很少这样做,因为这需要很长时间。如果你真的很疯狂,你可能会直接用二进制编写你的程序。有些人试图提出打印的最短可能程序Hello world; Ryan Henszey 解释了如何编写适用于 PC 处理器的 142 字节 ELF 可执行文件;布赖恩·雷特分析了ELF格式并提出了一个45字节的程序Linux 愿意执行(该程序不打印任何内容)。

还有一些可执行文件不是二进制文件;他们被称为脚本。相反,有许多二进制文件是不可执行的:图像、视频、压缩文件、文字处理文档、没有可执行文件的代码库入口点,其他处理器架构的可执行文件,...

相关内容