Mach-O Magic и Cigam Clarification

В настоящее время я делаю усовершенствованный исполняемый дизассемблер Mach-O, и я не совсем понимаю, какая часть Magic и Cigam является частью исполняемого заголовка. Я понимаю, как они работают и как они определяют порядок байтов исполняемого файла, и если он 32/64-разрядный, но я застрял в одном: вот какой шестнадцатеричный порядок представляет Магию и Сигаму:

Это необработанный шестнадцатеричный код общего заголовка (прямо из hexdump):

cffaedfe - Это 64-битный заголовок, но это магия или Cigam.

Причина, по которой я путаюсь с этим, заключается в том, что для того, чтобы все упорядочить, как cigam, нужно переворачивать каждые 4 байта в обратном направлении, и я читаю байты в порядке байтов или нет??? Я посмотрел на заголовки машин и нашел следующее:

MH_MAGIC_64 = 0xfeedfacf

MH_CIGAM_64 = 0xcffaedfe (MH_MAGIC поменялся местами)

но 0xcffaedfe должен совпадать с прямым шестнадцатеричным из файла mach-o, означающего его CIGAM, или я должен прочитать его на Endian и cffaedfe становится feedfacf делая это волшебство????

просто, пожалуйста, скажи мне:

(прямо из файла hexdump) cffaedfe - Это магия или сигарета????

Спасибо

1 ответ

Решение

MH_MAGIC_64 а также MH_CIGAM_64 к ним не прикреплены абсолютные порядки байтов, их значение связано с порядком байтов хозяина.

Допустим, у вас есть двоичный A для архитектуры с прямым порядком байтов с его первыми четырьмя байтами cf fa ed feи двоичный B для большой байтовой архитектуры с ее первыми четырьмя байтами fe ed fa cf,

На машине с прямым порядком байтов двоичный A будет иметь MH_MAGIC_64 и двоичный B будет иметь MH_CIGAM_64, но на большой машине с прямым порядком байтов двоичный B будет иметь MH_MAGIC_64 и А будет иметь MH_CIGAM_64,

Итак, по сути, вы читаете магию, используя свой собственный порядок байтов хоста, и если он совпадает MH_CIGAM_64, тогда вам придется поменять местами все целые числа, которые вы читаете из этого двоичного файла.

Другие вопросы по тегам