【问题标题】:ELF Header Magic - Why was 0x7F put in it?ELF Header Magic - 为什么要放入 0x7F?
【发布时间】:2019-06-05 10:09:42
【问题描述】:

我读过的关于 ELF 标头魔法的每个资源都指出它包含 ASCII 编码的“ELF”,然后简要提到 0x7F 被添加到它前面而没有解释。

0x7F 有什么原因吗?

这是为了避免与现有格式发生冲突吗?现有标准合规性?用于检测有关磁盘或内存的内容?

【问题讨论】:

  • 0x7F 有什么原因吗? 很可能是因为0x7F wasn't "claimed" yet,它是几乎所有二进制文件的一个很好的系列,也不是可打印的 ASCII 字符 (@987654322 @)。添加的ELF(ASCII 格式)加起来是一个不错的完整 32 位或四个字节。
  • 这似乎是合理的。虽然它是唯一以 0x7F 开头的签名,但少数以 0x45 ('E') 开头的签名非常奇特,似乎 ELF 文件仍然可以以 'ELF' 开头并为 32 位添加一个额外的字节。
  • 32 位与 ELF 签名无关,因为 ELF 标头的前 16 个字节应该逐字节解析,因为我们还不知道文件的字节序(它被写入字节#5)。作为一个不可打印的字符也不能解释任何事情,考虑到还有一堆其他不可打印的 ASCII 字符可以同样好地完成这项工作。作为一个很好的一串 - 也无关紧要,因为 0xFF 有所有的(不仅仅是低 7 位),所以使用这种逻辑会更好。
  • 我删除了我的答案。不要忘记对抱怨它的 John Bollinger 说“谢谢”:q 对其他读者:不要指望我在 Stack 上得到更多答案。我已经完成了这个网站,它是“社区”。
  • @SasQ 抱歉,我没有尽快回复您。我很感激你的回答。我正计划看看我是否可以更多地研究这个角度然后回复你,因为这似乎是一个有效的解释。

标签: linux linux-kernel elf


【解决方案1】:

很明显,是leet

7F 听起来像 leet 中的精灵。字母 L 在 leet 中可以表示为 7。用F发音字母L,听起来像精灵。除了 0x7F 之外不可能有其他字节。

【讨论】:

  • 虽然是一个很好的理论,但 Leet 在 ELF 创建时并没有那么受欢迎。标题的其余部分也只是普通的 ascii,所有 leet 看起来都像 0x37F。这似乎更有可能是一种功能选择,但如果你能指出更多的证据,我可能会相信。
  • 几乎一样受欢迎?那有什么意思?是否有直方图显示 Leet 在其起源的 4 年(1980 年代)的过程中的受欢迎程度。另一方面,ELF 始于 1995 年,您可以从格式参考的 1.0 版的早期草稿中看到,后来在 1999 年被采用为 Unix 的标准。大多数文件签名是 4 个字节,其次是 2 个,然后是偶数个字节。 0x37F 不适合一个字节,因为它们已经有 3 个(ELF)。
  • 一个神奇的数字作为功能选择?你在开玩笑吗?这些年来,忽略第一个字节是 0x7F 的基本、重要功能,我们是如何生存下来的? Linux 如何在不使用 ELF 创建者做出的最重要和最实用的选择(即使用 0x7F 作为其幻数的第一个字节)的情况下执行 ELF 文件?
  • ELF 标准是 88 年发布的 SVR4 的一部分,因此它的创建时间很可能是在 80 年代中期。它成为许多供应商设计的标准。幻数可以通过确保旧硬件不运行应用程序(指令 0x7f)或传送字节序来帮助实现这一点。
猜你喜欢
  • 2020-08-17
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多