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
, тогда вам придется поменять местами все целые числа, которые вы читаете из этого двоичного файла.