【问题标题】:Why in ELF binaries the bytes are inverted in groups of two为什么在 ELF 二进制文件中字节以两个为一组进行反转
【发布时间】:2020-10-22 15:59:38
【问题描述】:

我正在尝试创建 ELF 格式的标题编辑器。在开发过程中,我注意到在二进制组中两个字节总是被反转的。

这里是一个 hexdump 示例(我将它称为 hexdump1 以供参考)。

pc@pc-VirtualBox:~/Documents/ElfEditor$ hexdump Test | head
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0003 003e 0001 0000 07a0 0000 0000 0000
0000020 0040 0000 0000 0000 2758 0000 0000 0000
0000030 0000 0000 0040 0038 0009 0040 0022 0021
0000040 0006 0000 0004 0000 0040 0000 0000 0000
0000050 0040 0000 0000 0000 0040 0000 0000 0000
0000060 01f8 0000 0000 0000 01f8 0000 0000 0000
0000070 0008 0000 0000 0000 0003 0000 0004 0000
0000080 0238 0000 0000 0000 0238 0000 0000 0000
0000090 0238 0000 0000 0000 001c 0000 0000 0000

例如,在前 4 个字节中,我期待的是“7f45 4c46”而不是“457f 464c”。

当我使用 -C 参数运行 hexdump 时,我得到了我期望的转储。 (我将把这个 hexdump 称为 hexdump2 以供参考)。

00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  03 00 3e 00 01 00 00 00  a0 07 00 00 00 00 00 00  |..>.............|
00000020  40 00 00 00 00 00 00 00  58 27 00 00 00 00 00 00  |@.......X'......|
00000030  00 00 00 00 40 00 38 00  09 00 40 00 22 00 21 00  |....@.8...@.".!.|
00000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
00000050  40 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  |@.......@.......|
00000060  f8 01 00 00 00 00 00 00  f8 01 00 00 00 00 00 00  |................|
00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................|
00000080  38 02 00 00 00 00 00 00  38 02 00 00 00 00 00 00  |8.......8.......|
00000090  38 02 00 00 00 00 00 00  1c 00 00 00 00 00 00 00  |8...............|

二进制文件保存为 hexdump1,这使得在 C 中难以读取。

只是一些额外的信息。这不是字节序问题,因为相关数据(例如整数)在 hexdump2 中以小端格式正确,而在 hexdump1 中不正确。例如,在偏移量字节 0x14 开始一个 32 位 Int(值为 1),在 hexdump2 中它由字节 01 00 00 00 正确表示,而在 hexdump1 中它不正确(字节 00 01 00 00)。

所以我的疑问是:

  1. 这种行为正常吗?
  2. 为什么会这样?
  3. 在所有 Linux 发行版和架构中都以这种方式发生吗?
  4. 我可以只反转整个文件(包括二进制文件的其余部分)中的字节吗?
  5. 是否有一种简单或正确的方法来更正字节顺序?

我想让我的程序灵活地在任何 Linux 发行版或架构中运行。 感谢您提前提供帮助。

【问题讨论】:

  • 两个 hexdump 都是正确的,因为7F 45 确实是457F 的小端表示。只是第一个转储将数据显示为 16 位值,而在第二个转储中,数据按字节显示。
  • 感谢您的回复。当我在 C 中读取二进制文件时,我也得到了 hexdump1 中的字节。它是否也在 16 位块中读取(为什么是 16 位而不是其他值)?文件中的前 16 个字节应该是一个无符号字符数组。 char 数组不应该独立于字节序保持有序吗?

标签: c linux binary elf


【解决方案1】:

field

e_ident[EI_DATA]

定义elf二进制的字节序。

根据字节序,大小大于 1 的字段将被反转或不反转。

【讨论】:

  • 感谢您的回复。好的,我开始接受它是字节序。然而,这种行为对我来说仍然很奇怪。查看 ELF 格式标题“/usr/includes/elf.h”的前 16 个字节是一个无符号字符数组。据我所知(或者我认为我知道),一个字符数组将以相同的顺序存储在大端和小端中。然而,这里它以两个字节为一组(为什么是两个字节)发生变化。此外,这个“2 字节”结束性正在从正确位置更改整数的位置,如 0x14 所示。
猜你喜欢
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2019-04-14
  • 2015-11-07
  • 1970-01-01
  • 2018-06-20
  • 2016-07-06
  • 2011-01-25
相关资源
最近更新 更多