詳解 Mach-O 文件結構

前言

在學習iOS逆向的過程中,發現在解密可執行文件 dumpdecrypted 砸殼原理時需要用到 Mach-O 相關知識,在動態庫注入過程中也需要理解 Mach-O 可執行文件的文件結構,那么有必要系統學習記錄 Mach-O 文件的組成結構。

什么是 Mach-O

Mach-O,是 Mach object 文件格式的縮寫,是一種可執行文件、目標代碼、共享程序庫、動態加載代碼和核心 dump 。是 a.out 格式的一種替代。 Mach-O 提供更多的可擴展性和更快的符號表信息存取。Mach-O 應用在基于 Mach 核心的系統上,目前 NeXTSTEP、Darwin、Mac OS X(iPhone)都是使用這種可執行文件格式。熟悉 Mach-O 文件格式,有助于了解蘋果底層軟件運行機制,更好的掌握 dyld 加載 Mach-O 的步驟,為自己動手開發 Mach-O 相關的加解密工具注入工具打下基礎。

屬于 MachO 格式的常見文件

  • 目標文件.o
  • 庫文件
    • .a
    • .dylib
    • Framework
  • 可執行文件
  • dyld
  • .dsym

通用二進制文件(Universal binary)

  • 蘋果公司提出的一種程序代碼。能同時適用多種架構的二進制文件

  • 同一個程序包中同時為多種架構提供最理想的性能

  • 因為需要儲存多種代碼,通用二進制應用程序通常比單一平臺二進制的程序要大,但是由于兩種架構有共同的非執行資源(代碼以外的),所以并不會達到單一版本的兩倍之多

  • 而且由于執行中只調用一部分代碼,運行起來也不需要額外的內存

lipo 命令的使用

  • 使用lifo -info 可以查看MachO文件包含的架構 ($lipo -info MachO文件)
  • 使用lifo –thin 拆分某種架構 ($lipo MachO文件 –thin 架構 –output 輸出文件路徑)
  • 使用lipo -create 合并多種架構 ($lipo -create MachO1 MachO2 -output 輸出文件路徑)

Mach-O 文件結構

image.png

Mach-O 的組成結構如圖所示

  • Mach-O 頭部(Mach Header),包含該二進制文件的一般信息
    • 字節順序、架構類型、加載指令的數量等
    • 使得可以快速確認一些信息,比如當前文件用于32位還是64位,對應的處理器是什么、文件類型是什么
  • 加載命令(Load commands),一張包含很多內容的表,內容包括區域的位置、符號表、動態符號表等
  • Data 通常是對象文件中最大的部分,包含Segement的具體數據

1、Header 的數據結構

header.png

header_info.png

2、Load Commands 的部分信息

Load Commands.png
LoadCommands2.png

3、Data 數據區

數據段 segment

存放數據:代碼、字符常量、類、方法等, 可以擁有多個 segment ,每個 segment 可以有零到多個 section 。每個段都有一段虛擬地址映射到進程的地址空間,先來看下數據結構, LC_SEGMENT_64 定義了一個 64 位的 segment,其定義如下:

Data.png

dyldfileoff (基于當前架構的文件偏移量)處 fileSize 大小的內容加載到虛擬內存的 vmaddr 處,其大小為 vmsizesegment 的權限由 initprot 進行初始化。
LC_SEGMENT_64 包括了一下 4 種:

  • _PAGEZERO : 空指針陷阱段,用與捕捉對 iNULL 指針的引用;
  • _TEXT : 代碼段/只讀數據段;
  • _DATA : 讀取/寫入數據的段;
  • _LINKEDIT : dyld 需要的信息;
Section 段
在 Segment 里面會包含不同的 section ,其結構如下圖:
Section.png
  • sectname: section 的名字
  • segname: segment 的名字
  • addr: 映射到虛擬地址的偏移
  • size: section 的大小
  • offset: section 在當前架構中的偏移
  • align: section的字節對齊大小 n
  • reloff: 重定位入口的文件偏移
  • nreloc: 重定位入口的個數
  • flags: section的類型與屬性:
  • reserved: 保留位
__TEXT SegmentSection:
__TEXT.png
  • __text: 可執行文件的代碼區域
  • __objc_methname: 方法名
  • __objc_classname: 類名
  • __objc_methtype: 方法簽名
  • __cstring: 類 C 風格的字符串
__DATA SegmentSection:
__DATA.png
  • __nl_symbol_ptr: 非懶加載指針表,dyld 加載會立即綁定
  • __ls_symbol_ptr: 懶加載指針表
  • __mod_init_func: constructor 函數
  • __mod_term_func: destructor 函數
  • __objc_classlist: 類列表
  • __objc_nlclslist: 實現了 load 方法的類
  • __objc_protolist: protocol的列表
  • __objc_classrefs: 被引用的類列表
  • __objc _catlist: Category列表
Symbol Table 符號表,這個是重點中的重點,符號表是將地址和符號聯系起來的橋梁。符號表并不能直接存儲符號,而是存儲符號位于字符串表的位置。
String Table.png
String Table 字符串表所有的變量名、函數名等,都以字符串的形式存儲在字符串表中。
String Table.png
Dynamic Symbol Table 動態符號表,動態符號表并不存儲符號信息,而是存儲其位于符號表的偏移信息。Fishhook 源碼看起來比較復雜主要是因為 hook 的是動態鏈接的函數,索引和鏈接關系比較繞。但是我們自己編寫的C函數不是動態鏈接的,而是在編譯鏈接后代碼指令就存儲在文件內部的函數,因此不會用到動態符號表。接下來我們以 static 函數為例,看看如何動態的查找自己編寫的函數地址。
Dynamic Symbol Table.png

關于 Mach-O 更具體的扔然需要我們去探究,只有知道了底層我們才能有更多的方法去解決問題,并且優化問題。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容