2017-06-16 5 views
0

Je suis en train de faire un désassembleur exécutable Mach-O avancé et je suis confus au sujet de la partie Magic et Cigam d'un en-tête exécutable. Je comprends comment ils fonctionnent et comment ils déterminent l'ordre des octets de l'exécutable et si son 32/64-Bit, mais la seule chose que je suis coincé est: quel ordre hexadécimal représente Magic et Cigam:Mach-O Magic et Cigam Clarification

Ceci est la hexadécimal brut d'un en-tête commun (directement à partir de hexdump):

cffaedfe - Il s'agit d'un en-tête 64 bits, mais c'est un Magic ou un Cigam.

La raison pour laquelle je suis confondu avec ceci est à cause de toute la commande comme le cigam exige renverser tous les 4 octets dans la direction opposée et fais je lise les octets dans Endianness ou pas ??? Je l'ai regardé les en-têtes de mach et je l'ai trouvé ce genre de choses:

MH_MAGIC_64 = 0xfeedfacf

MH_CIGAM_64 = 0xcffaedfe (MH_MAGIC permuté)

mais est 0xcffaedfe destiné à être adapté à partir du hexadécimal direct le fichier mach-o signifiant son CIGAM ou est-ce que je le lis dans Endian et cffaedfe devient feedfacf le rendant MAGIQUE ????

juste s'il vous plaît me dire:

(direct à partir du fichier hexdump) cffaedfe - Est-ce ou de la magie Cigam ????

Merci

Répondre

1

MH_MAGIC_64 et MH_CIGAM_64 ne sont pas une boutisme absolue qui leur sont rattachés, leur signification est par rapport au boutisme hôte. Supposons que vous ayez un binaire A pour une architecture little endian avec ses quatre premiers octets cf fa ed fe, et un binaire B pour une architecture big endian avec ses quatre premiers octets fe ed fa cf.

Sur une petite machine endian, binaire A aura MH_MAGIC_64 et B binaire aura MH_CIGAM_64, mais sur une grosse machine endian binaire B aura MH_MAGIC_64 et A aura MH_CIGAM_64. Donc, en gros, vous lisez la magie en utilisant l'ordre des octets de votre hôte natif et s'il correspond à MH_CIGAM_64, vous devrez inverser tous les entiers que vous lisez depuis ce binaire.

+0

Comment savoir si ma machine utilise un petit boutiste ou un big endian? – Lucasware

+0

'uint16_t u = 1; printf ("% s endian \ n", * (uint8_t *) & u "petit": "grand"); ' – Siguza