ipa包主要由三大部分構成:
1、可執行文件;2、Asset.car 文件(asset 文件夾中圖片的壓縮文件);3、其他:_CodeSignature文件夾,簽名信息。
- 使用 file 命令查看這個可執行文件:這是個 Mach-O 文件類型,里面包含了兩個架構:armv7&arm64。
file DingTalk
- 使用otool查看Mach-O文件:
otool -h DingTalk
。使用反匯編工具對執行文件進行反匯編可以對Mach-O文件有一個直觀的認識。
Mach-O:
Mach-O為Mach Object 文件格式的縮寫,它是一種用于可執行文件,目標代碼,動態庫,內核轉儲的文件格式。
是iOS/Mac OS上存儲程序以及庫的標準格式。
- 常見的Mach-O格式的文件
- MH_OBJECT 目標文件:
.o
.a/
.framework靜態庫
,靜態庫即多個.o文件存放在一起實現特定的功能。 - MH_EXECUTE 可執行文件:
.app/MyApp
.out
- MH_DYLIB 動態庫:
.framework/xxx
/dylib
- MH_DYLINKER 動態鏈接器:
usr/lib/dyld
- MH_DSYM 存儲二進制文件符號信息的文件:
.dYSM/Contents/Resources/DWARF/MyApp
- MH_OBJECT 目標文件:
- Mach-O文件的基本結構
- 頭部(header structure):文件類型, 目標架構。
- 加載命令(load command):描述文件在虛擬內存中的邏輯與布局。
- 段(segment)。可以擁有多個段(segment),每個段可以擁有零個或多個區域(section)。每一個段(segment)都擁有一段虛擬地址映射到進程的地址空間。加載命令中定義的原始數據。
- 鏈接信息。一個完整的用戶級 Mach-o 文件的末端是鏈接信息。其中包含了動態加載器用來鏈接可執行文件或者依賴庫所需使用的符號表、字符串表等等。
- 分析Mach-O結構
Mach Header(arm64)
Magic Number : 魔數, 表示支持設備的CPU位數(oxFEEDFACE : 表示32位二進制、oxFEEDFACF : 表示64位二進制)
cputype和 cpusubtype: CPU類型和子類型
filetype : Mach-O文件類型
ncmds 和 sizeofcmds: 用于加載器的 加載命令的條數和大小
flags : 動態鏈接器dyld的標志
基本的編譯過程分為四個步驟:
- 預處理(Pre-process):把宏替換,刪除注釋,展開頭文件,產生 .i 文件。
- 編譯(Compliling):使用預處理后的單詞構建詞法樹,生成語法樹輸出 AST(Abstract Syntax Tree),將 AST 轉化為更低級的中間碼(LLVM IR),優化中間代碼生成輸出匯編代碼,把之前的 .i 文件轉換為匯編語言,產生 .s 文件。
- 匯編(Asembly):把匯編語言文件轉換為機器碼文件,產生 .o 文件。
- 鏈接(Link):對 .o 文件中的對于其他的庫的引用的地方進行引用,生成最后的可執行文件(同時也包括多個.o文件進行 link)。
LinkMap
LinkMap中存放的是app可執行文件Mach-O格式組織的各類數據的清單,根據LinkMap展開對Mach-O文件及dyld加載Mach-O可執行文件的細節;
LinkMap文件是xcode link時產生的中間文件,一般用于調試,可以精確知道某個地址對應的函數。
iOS APP編譯后,除了一些資源文件,剩下的就是一個可執行文件。
1.XCode開啟編譯選項Write Link Map File
2.編譯后,到編譯目錄里找到該txt文件,文件名和路徑就是上述的Path to Link Map File
這個LinkMap里展示了整個可執行文件的全貌,列出了編譯后的每一個.o目標文件的信息(包括靜態鏈接庫.a里的),以及每一個目標文件的代碼段,數據段存儲詳情。
1
目標文件列表,中括號里的是這個文件的編號。
2
段表:首列是數據在文件的偏移位置,第二列是這一段占用大小,第三列是段類型,代碼段和數據段,第四列是段名稱。第一行位置+大小 = 第二行位置。
__text表示編譯后的程序執行語句
__data表示已初始化的全局變量和局部靜態變量
__bss表示未初始化的全局變量和局部靜態變量
__cstring表示代碼里的字符串常量
以下是__TEXT段的section
__text 主程序代碼
__stubs 和__stub_helper 用于動態鏈接庫的stub
__cstring c語言字符串
__const const修飾的常量
__objc_methname objc的方法名稱
__objc_methtype objc方法類型
__objc_classname objc類方法
以下是__DATA段的section
__objc_ivars objc類的實例變量
__objc_classlist objc類列表
__objc_protolist objc協議列表
__objc_imageinfo objc鏡像信息
__objc_const objc常量
__objc_selfrefs objc自引用(self)
__objc_protorefs objc協議引用
__objc_superrefs objc超類引用
__cfstring 使用Core Foundation字符串
__bss BSS
3
接著就是按上表順序,列出具體的按每個文件列出每個對應字段的位置和占用空間。
首列是數據在文件的偏移地址,第二列是占用大小,第三列是所屬文件序號,對應上述Object files列表,最后是名字。
4
// 已廢棄&多余重復的字段
# Dead Stripped Symbols:
自動分析LinkMapParser