MachO文件

MachO文件

前言

Mach-O(Mach Object):Mach-O 文件是Mach object文件格式的縮寫(xiě)灌砖,它是可執(zhí)行文件璧函、目標(biāo)代碼、動(dòng)態(tài)庫(kù)的文件格式

主要包括:

  • 目標(biāo)文件.o
  • 庫(kù)文件
  • .a
  • .dylib
  • Framework
  • 可執(zhí)行文件
  • dyld
  • .dsym

可以通過(guò)file命令查看文件類(lèi)型
下面就來(lái)用file簡(jiǎn)單查看下這些文件

  1. .o 文件
    首先創(chuàng)建一個(gè)C文件通過(guò)Clang編譯可以得到目標(biāo)文件.o


    1622547092622.png
1622547134411.png

通過(guò) clang -c demo.命令編譯生成.o目標(biāo)文件

1622547224293.png

通過(guò)file命令查看.o文件


1622547331572.png

說(shuō)明.o文件是Mach-O文件類(lèi)型的 64位(64-bit) object文件 x86_64架構(gòu)
使用clang demo.o生成a.out可執(zhí)行文件

1622547660467.png

a.out 是一個(gè)可執(zhí)行文件(executable)

  1. .a 文件 和 Framework
    使用 find ~/ -name "*.a" 命令可以找到家目錄下的.a文件
    找到之后查看一下.a
    使用file命令查看.a文件
    1622548473914.png

輸出current ar archive random library這一坨不知道是什么鬼基显,有知道的大神可以幫忙解釋一下

  1. .dylib文件
    使用file命令查看


    1622548728531.png

4.dyld


1622549080217.png

dyld 是一個(gè)動(dòng)態(tài)連接器(dynamic linker)蘸吓,包含多個(gè)架構(gòu)的通用二進(jìn)制文件(universal binary with 3 architectures)

通用二進(jìn)制文件

通用二進(jìn)制文件是蘋(píng)果公司提出來(lái)的一種程序代碼,能同時(shí)適用多種架構(gòu)
實(shí)現(xiàn)同一個(gè)程序包為多種架構(gòu)提供最理想的性能
因?yàn)榇嬖卺槍?duì)多種架構(gòu)的代碼所以比單一架構(gòu)的包體積大撩幽,又因?yàn)榇嬖诠餐姆菆?zhí)行資源(代碼以外的)库继,所以比多個(gè)單一平臺(tái)代碼包的體積小
由于每種架構(gòu)只運(yùn)行對(duì)應(yīng)架構(gòu)的代碼,所以運(yùn)行起來(lái)時(shí)不會(huì)占用額外的內(nèi)存

指令集
Armv6窜醉、armv7宪萄、armv7s、arm64都是arm處理器的指令集酱虎,所有指令集原則上都是向下兼容的雨膨,如iPhone4S的CPU默認(rèn)指令集為armv7指令集,但它同時(shí)也兼容armv6指令集读串,只是使用armv6指令集時(shí)無(wú)法充分發(fā)揮其性能聊记,即無(wú)法使用armv7指令集中的新特性,同理恢暖,iPhone5的處理器標(biāo)配armv7s指令集排监,同時(shí)也支持armv7指令集,只是無(wú)法進(jìn)行相關(guān)的性能優(yōu)化杰捂,從而導(dǎo)致程序的執(zhí)行效率沒(méi)那么高舆床。

需要注意的是iOS模擬器沒(méi)有運(yùn)行arm指令集,編譯運(yùn)行的是x86指令集嫁佳,所以挨队,只有在iOS設(shè)備上,才會(huì)執(zhí)行設(shè)備對(duì)應(yīng)的arm指令集蒿往。

移動(dòng)設(shè)備默認(rèn)指令集

  • armv6 : iPhone, iPhone2, iPhone3G
  • armv7(32bit):iPhone3GS, iPhone4, iPhone4S
  • armv7S(32bit):iPhone4/iPhone4s (32位)
  • arm64(64bit):iPhone5s(5s+)
  • x86_64(64bit): 支持非M1Mac電腦的cpu架構(gòu)(64位模擬器)
  • i386:32位架構(gòu)模擬器

iOS11(及以上)系統(tǒng)只支持64位的設(shè)備就是5s(及以上)的設(shè)備才能安裝盛垦,Xcode所以選擇iOS11及以上系統(tǒng)Archive時(shí)生成的包只包含arm64架構(gòu),選擇iOS10及以下系統(tǒng)打出來(lái)的包才有可能包含多個(gè)架構(gòu)
在Xcode -> build Settings->search "mach"可以選擇編譯生成的產(chǎn)物


1622552989804.png

Mach-O Type

  • Executable:可執(zhí)行文件
  • Dynamic Library:動(dòng)態(tài)庫(kù)
  • Static Library:靜態(tài)庫(kù)
  • Bundle:Bundle
  • Relocatable Object File:這個(gè)不知道是什么鬼

使用Xcode編譯 選擇最低支撐iOS11.0系統(tǒng)


1622553451512.png

查看編譯生成包中的可執(zhí)行文件


1622553521769.png

可以看到編譯生成包中的可執(zhí)行文件只支持arm64架構(gòu)

再次選擇最低支撐iOS10.0系統(tǒng)


1622553668749.png

可以看到編譯生成包中的可執(zhí)行文件變成了通用二進(jìn)制文件支持arm64瓤漏、和armv7兩種架構(gòu)

Xcode中編譯架構(gòu)設(shè)置 Build Settings -> Search "architectures" 下的Architecture


1622553897010.png

默認(rèn)最多只支持arm64腾夯、armv7,可以修改這個(gè)配置支持更多架構(gòu)
選擇others加上armv7s然后再build


1622555144857.png

可以看到可執(zhí)行文件多了armv7s架構(gòu)

Lipo工具

  1. 使用lipo -info 可以查看MachO文件包含的架構(gòu) lipo -info MachO名稱(chēng)

    1622555459535.png

  2. 使用lifo –thin 拆分某種架構(gòu) lipo MachO文件 –thin 架構(gòu) –output 輸出文件路徑

    1622555576836.png

3.使用lipo -create 合并多種架構(gòu)lipo -create MachO1 MachO2 -output 輸出文件路徑

1622555764340.png

MachO文件結(jié)構(gòu)

1622631734095.png

如圖所示MachO文件包含三個(gè)部分:
1. Header
header 是MachO的頭蔬充,其中包含了該MachO文件的一些信息

  • 字節(jié)順序蝶俱、架構(gòu)類(lèi)型、加載指令數(shù)量等
  • 通過(guò)Header快速確認(rèn)一些信息饥漫,比如32位還是64位榨呆,處理器架構(gòu),文件類(lèi)型等

2. Load commands
Load commands是一張包含一堆加載指令表

  • 包含加載指令告訴dyld如何加載這個(gè)MachO

3. Data
Data是MachO中最大的部分

  • 包含Segement的具體數(shù)據(jù)

首先用MachOView查看一下Header


1622636950762.png

在Xcode里command + shift + o 搜索Loader.h可以找到Header的定義


1622637106397.png

Header的具體內(nèi)容及釋義


1622632746599.png

使用MachOView查看MachO文件

2D5CD41B-67A9-43AE-84A3-06B20B829279.jpeg

其中Load commands各條加載指令的含義如下:

  1. LC_SEGMENT_64:將文件中(32位或者64位)的段映射到進(jìn)程地址空間中
  2. LC_DYLD_INFO_ONLY:動(dòng)態(tài)連接相關(guān)信息
  3. LC_SYMTAB:符號(hào)地址
  4. LC_DYSYMTAB:動(dòng)態(tài)符號(hào)表地址
  5. LC_LOAD_DYLINKER:使用什么加載趾浅,iOS的App使用dyld加載
  6. LC_UUID:文件的UUID
  7. LC_VERSION_MIN_IPHONEOS:最低支持的操作系統(tǒng)版本
  8. LC_SOURCE_VERSION:源代碼版本
  9. LC_MAIN:程序主線(xiàn)程的入口地址和棧大小
  10. LC_ENCRYPTION_INFO_64 加密信息
  11. LC_LOAD_DYLIB:依賴(lài)庫(kù)的路徑愕提,包含三方庫(kù)
  12. LC_RPATH:dyld維護(hù)一個(gè)稱(chēng)為運(yùn)行路徑列表的路徑的當(dāng)前堆棧馒稍。當(dāng)遇到@rpath時(shí)皿哨,它會(huì)被替換為運(yùn)行路徑列表中的每個(gè)路徑浅侨,直到找到可加載的dylib(此項(xiàng)釋義是網(wǎng)上摘錄的還沒(méi)弄懂啥意思)
  13. LC_FUNCTION_STARTS:函數(shù)起始地址表
  14. LC_DATA_IN_CODE:定義在代碼段內(nèi)的非指令的表
  15. LC_CODE_SIGNATURE:代碼簽名

接下來(lái)詳細(xì)看下各個(gè)command的內(nèi)容:
LC_SEGMENT_64

1622638513362.png

  • VM Address:運(yùn)行時(shí)加載到內(nèi)存(虛擬內(nèi)存)的起始地址(要加上ALSR才是真正的內(nèi)存地址)
  • VM Size:內(nèi)存中占用大小
  • File Offset:在文件中的偏移地址
  • File Size:在文件中占用大小
    PS:可以看到_TEXT的File Offset是0,所以MachO文件是以代碼段起始的

LC_DYLD_INFO_ONLY

1622638704330.png

  • Rebase Info Offset:重定向開(kāi)始位置的偏移地址
  • Rebase Info Size:需要重定向的內(nèi)容的大小
  • Binding Info Offset:綁定數(shù)據(jù)的偏移地址
  • Binding Info Size:綁定數(shù)據(jù)的大小
  • Weak Binding Info Offset:弱綁定
  • Weak Binding Info Size:
  • Lazy Binding Info Offset:懶綁定(用到的時(shí)候再綁定)
  • Lazy Binding Info Size:
  • Export Info Offset:對(duì)外開(kāi)放的函數(shù)
  • Export Info Size:

LC_SYMTAB符號(hào)相關(guān)(函數(shù)名稱(chēng)证膨,函數(shù)地址)
LC_MAIN 逆向找不到切入點(diǎn)的時(shí)候經(jīng)常用到這個(gè)如输,當(dāng)別人做了防護(hù)App啟動(dòng)就閃退時(shí)可以斷住這個(gè)函數(shù)再做分析

使用 otool工具可以查看MachO的信息

Load commands的下面就是Data
Data分為_(kāi)TEXT段(代碼段)和_DATA段(數(shù)據(jù)段)


1622639877442.png

其中Section64(__TEXT,__text)是主程序代碼
Section64(__TEXT,__stubs)Section64(__TEXT,__stub_helper)是做符號(hào)綁定的
Section64(__TEXT,__objc_methname)是方法名稱(chēng)
Section64(__TEXT,__objc_classname)是類(lèi)名稱(chēng)
Section64(__TEXT,__objc_methtype)是方法類(lèi)型

其他內(nèi)容后面在用到的時(shí)候再補(bǔ)充

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市央勒,隨后出現(xiàn)的幾起案子不见,更是在濱河造成了極大的恐慌,老刑警劉巖崔步,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稳吮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡井濒,警方通過(guò)查閱死者的電腦和手機(jī)灶似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瑞你,“玉大人酪惭,你說(shuō)我怎么就攤上這事≌呒祝” “怎么了春感?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)虏缸。 經(jīng)常有香客問(wèn)我鲫懒,道長(zhǎng),這世上最難降的妖魔是什么刽辙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任窥岩,我火速辦了婚禮,結(jié)果婚禮上扫倡,老公的妹妹穿的比我還像新娘谦秧。我一直安慰自己,他們只是感情好撵溃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布疚鲤。 她就那樣靜靜地躺著,像睡著了一般缘挑。 火紅的嫁衣襯著肌膚如雪集歇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天语淘,我揣著相機(jī)與錄音诲宇,去河邊找鬼际歼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姑蓝,可吹牛的內(nèi)容都是我干的鹅心。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纺荧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旭愧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宙暇,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤输枯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后占贫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體桃熄,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年型奥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞳收。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桩引,死狀恐怖缎讼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坑匠,我是刑警寧澤血崭,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站厘灼,受9級(jí)特大地震影響夹纫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜设凹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一舰讹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闪朱,春花似錦月匣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至称诗,卻和暖如春萍悴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工癣诱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留计维,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓撕予,卻偏偏與公主長(zhǎng)得像鲫惶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗅蔬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在上一篇文章中剑按,咱們已經(jīng)簡(jiǎn)單的提到了MachO疾就,在用Framework做代碼注入的時(shí)候澜术,必須先向MachO的Loa...
    螞蟻也瘋狂閱讀 1,797評(píng)論 1 4
  • 一、MachO文件概述 Mach-O(Mach Object)是mac以及iOS上的格式猬腰, 類(lèi)似于windows上...
    HotPotCat閱讀 1,246評(píng)論 0 1
  • 前言 本篇文章主要分析MachO文件(也稱(chēng)作二進(jìn)制可執(zhí)行文件)鸟废,相信大家在平時(shí)開(kāi)發(fā)中都會(huì)碰到MachO文件這個(gè)概念...
    深圳_你要的昵稱(chēng)閱讀 653評(píng)論 0 2
  • 以一個(gè)簡(jiǎn)單的iOS項(xiàng)目,只有NSLog輸出語(yǔ)句姑荷,然后編譯(最好真機(jī)器)盒延,將編譯后的MachO文件使用MachOVi...
    呂建雄閱讀 1,381評(píng)論 0 1
  • 《iOS底層原理文章匯總》[http://www.reibang.com/p/15af435341ce]上一篇文...
    一畝三分甜閱讀 918評(píng)論 0 1