我目前正在制作一个先进的Mach-O可执行反汇编程序,并且对可执行标题的Magic和Cigam部分感到困惑。我理解它们如何工作以及它们如何确定可执行文件的字节顺序,如果它的32/64位,但我坚持的一件事是: 哪个十六进制顺序代表Magic和Cigam:
这是Common Header的原始十六进制(直接来自hexdump):
cffaedfe
- 这是一个64位标题,但它是Magic还是Cigam。
我对此感到困惑的原因是因为所有的顺序如雪茄需要在相反的方向上翻转每4个字节,我是否读取了Endianness中的字节?我看过马赫标题,我发现了这些东西:
MH_MAGIC_64 = 0xfeedfacf
MH_CIGAM_64 = 0xcffaedfe(MH_MAGIC已交换)
但0xcffaedfe意味着匹配来自mach-o文件的直接十六进制,意思是它的CIGAM,或者我是否在Endian中读取它,而cffaedfe
变成feedfacf
使它成为MAGIC ???? < / p>
请告诉我:
(直接来自文件hexdump)cffaedfe
- 这是Magic还是Cigam ????
由于
答案 0 :(得分:3)
MH_MAGIC_64
和MH_CIGAM_64
没有附加一些绝对字节序,它们的含义与主机字节序相关。
假设您有一个带有前四个字节cf fa ed fe
的小端结构的二进制A,以及一个带有前四个字节fe ed fa cf
的大端结构的二进制B.
在小端机器上,二进制A将具有MH_MAGIC_64
而二进制B将具有MH_CIGAM_64
,但在大端机器上,二进制B将具有MH_MAGIC_64
并且A将具有MH_CIGAM_64
。 1}}。
所以从本质上讲,你使用本机主机字节顺序读取魔法,如果它匹配MH_CIGAM_64
,那么你将不得不交换你从该二进制文件中读取的所有整数。