Mach-O 魔术和 Cigam 澄清

Mach-O Magic and Cigam Clarification

我目前正在制作高级 Mach-O 可执行反汇编器,我对可执行文件的 Magic 和 Cigam 部分感到困惑 Header。我了解它们的工作方式以及它们如何确定可执行文件的字节顺序以及它是否为 32/64 位但我坚持的一件事是: 哪个十六进制顺序代表Magic和Cigam:

这是 Common Header 的原始十六进制(直接来自 hexdump):

cffaedfe - 这是 64 位 Header 但它是 Magic 还是 Cigam。

我对此感到困惑的原因是因为像 cigam 这样的所有排序都需要在相反的方向上每 4 个字节翻转一次,我是否以 Endianness 读取字节???我查看了 mach headers 并且发现了以下内容:

MH_MAGIC_64 = 0xfeedfacf

MH_CIGAM_64 = 0xcffaedfe(MH_MAGIC 交换)

但是 0xcffaedfe 是否意味着要与 mach-o 文件中的直接十六进制匹配,这意味着它的 CIGAM 还是我在 Endian 中读取它并且 cffaedfe 变成 feedfacf 使其变得神奇? ???

请告诉我:

(直接来自文件 hexdump)cffaedfe - 这是 Magic 还是 Cigam????

谢谢

MH_MAGIC_64MH_CIGAM_64 没有附加绝对字节序,它们的含义是相对于主机字节序的。

假设您有一个用于小端架构的二进制 A,前四个字节为 cf fa ed fe,二进制 B 为大端架构,其前四个字节为 fe ed fa cf.

在小端机器上,二进制 A 将具有 MH_MAGIC_64,二进制 B 将具有 MH_CIGAM_64,但在大端机器上,二进制 B 将具有 MH_MAGIC_64,而 A 将具有MH_CIGAM_64.

所以本质上,您使用本地主机字节顺序读取魔法,如果它匹配 MH_CIGAM_64,那么您将不得不交换从该二进制文件读取的所有整数。