2017-06-16 92 views
0

我目前正在製作一個先進的Mach-O可執行反彙編程序,並且對可執行文件頭部的Magic和Cigam部分感到困惑。我瞭解它們是如何工作的以及它們如何確定可執行文件的字節順序,並且如果它的32/64位但是我卡在的一件事是這樣的: 其中十六進制順序表示Magic和Cigam:Mach-O Magic和Cigam澄清

這是共同標題的原始十六進制(直接來自hexdump):

cffaedfe - 這是一個64位標題,但它是Magic還是Cigam。

我對此感到困惑的原因是因爲所有的順序像cigam需要翻轉每4個字節在相反的方向,我讀的字節在Endianness或不?我看了一下馬赫頭和我發現這個東西:

MH_MAGIC_64 = 0xfeedfacf

MH_CIGAM_64 = 0xcffaedfe(MH_MAGIC交換)

但0xcffaedfe打算從從直接十六進制匹配mach-o文件的意思是它的CIGAM,還是我在Endian中讀取它,並且cffaedfe變成feedfacf使它成爲MAGIC?

只是請告訴我:

(直接從文件hexdump都可以)cffaedfe - 這是魔法或Cigam ????

感謝

回答

1

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,那麼您將不得不圍繞從該二進制讀取的所有整數進行交換。

+0

如何查看我的機器是使用小端還是大端? – Lucasware

+0

'uint16_t u = 1; printf(「%s endian \ n」,*(uint8_t *)&u?「小」:「大」);' – Siguza