簡介
Mach-O是iOS/OS可執(zhí)行文件。編譯成功后炎咖,找到app文件->顯示包內(nèi)容与纽,即可找到可執(zhí)行文件侣签。
常用指令
- 查看Mach-O格式
lipo -info <可執(zhí)行文件>
- 查看Mach-O架構(gòu)
lipo -info <可執(zhí)行文件>
- 查看Mach-O的Header
otool -h <可執(zhí)行文件>
otool -hv <可執(zhí)行文件>
- 查看Mach-O的Load Commands
otool -lv <可執(zhí)行文件>
Mach-O文件讀取工具M(jìn)achOView
Mach-O文件解析
- Mach64Header
magic(魔數(shù)):0xfeedface-32位、0xfeedfacf-64位急迂、0xcafebabe-通用格式
(魔數(shù)的讀扔八:32位為小端讀取,低地址在低位僚碎,高地址在高位猴娩、64位為大端讀取,低地址在高位勺阐,高地址在低位)
cputype卷中、cpusubtype:CPU的平臺與版本
armv7:cputype-12、cpusubtype-9
arm64:cputype-16777228渊抽、cupsubtype-0
filetype:可執(zhí)行文件(2)蟆豫、庫文件、Core懒闷、內(nèi)核擴(kuò)展
OBJECT(目標(biāo)文件)-1十减、EXECUTE(可執(zhí)行文件)-2、DYLIB(動態(tài)庫)-6
ncmds愤估、sizeofcmds:Load Commands的個數(shù)和長度
flags:dyld加載時需要的標(biāo)志位帮辟,PIE表示開啟地址空間隨機(jī)化
Reserved:只有64位時才存在
-
Load Commands
image.png
LC_SEGMENT/LC_SEGMENT_64 - 將文件中(32位或64位)的段映射到進(jìn)程地址空間中
LC_SYMTAB - 符號表信息
LC_DYSYMTAB - 動態(tài)符號表信息
LC_LOAD_DYLINKER - 加載動態(tài)鏈接器(/usr/lib/dyld)
LC_UUID - 文件的唯一標(biāo)識,crash解析中也會有玩焰,去匹配dysm文件和crash文件
LC_VERSION_MIN_IPHONEOS - 二進(jìn)制文件要求最低操作系統(tǒng)版本
LC_MAIN - 設(shè)置程序主線程的入口地址和棧大小
LC_ENCRYPTION_INFO - 加密信息由驹,查看文件加密信息(otool -l <可執(zhí)行文件> | grep cryptid)
LC_LOAD_DYLIB - 加載的動態(tài)庫,包括動態(tài)庫地址和名稱昔园,當(dāng)前版本號蔓榄,兼容版本號(otool -l <可執(zhí)行文件>)
LC_FUNCTION_STARTS - 函數(shù)起始地址表
LC_CODE_SIGNATURE - 代碼簽名信息
main函數(shù)地址查看
某些Segment中包含Section,Section是具體數(shù)據(jù)存放的地方
__TEXT中節(jié)分類:
__text - 主程序代碼
__stub_helper - 用于動態(tài)鏈接的存根
__picsymbolstub4 - 用于動態(tài)鏈接的存根
__objc_methname - Object-C的方法名
__objc_classname - Object-C的類名
__objc_methtype - Object-C的方法類型
__cstring - 字符串
指令查看節(jié)的信息
otool -s __TEXT __text <可執(zhí)行文件>
顯示最上面的10行數(shù)據(jù)
otool -tv <可執(zhí)行文件名> |head -n 10
__DATA中節(jié)分類:
__la_symbol_ptr - 延遲加載節(jié)默刚,通過dyld_stub_binder輔助鏈接(程序在加載時润樱,符號的地址沒有對應(yīng)到真實的地址,只有在第一次使用這個符號時羡棵,才會去匹配這個符號的地址壹若,第二次使用時就可以直接找到)
__nl_symbol_ptr - 非延遲加載節(jié)(程序在加載時,符號的地址已經(jīng)確定下來皂冰,使用時可以直接找到)
__mod_init_func - 初始化的全局函數(shù)的地址店展,會在main函數(shù)之前執(zhí)行
__mod__term_func - 結(jié)束函數(shù)地址
__cfstring - Core Foundation用到的字符串
__objc_classlist - Object-C的類列表
__objc_protollist - 協(xié)議的列表
__objc_nlclslist - Object-C的load函數(shù)列表,比__mod_init_func更早執(zhí)行
__objc_const - Object-C的常量
__data - 初始化的可變的變量
__bss - 未初始化的靜態(tài)變量
- 查看可執(zhí)行文件簽名信息
codesign -dvvv <可執(zhí)行文件名>
Mach-O解析案例
-
主程序代碼__text真實偏移的計算(以armv7為例)
將可執(zhí)行文件秃流,拖入Mach-OView中
image.png
armv7起始偏移:16384->0x4000
image.png
Section Header偏移:24936->0x6168
image.png
Section(__TEXT,__text)真實偏移:0x4000+0x6168->0xA168 - 通過Mach-O查看類名赂蕴、方法名、字符串
新建類MyObject舶胀,然后編譯概说,將mach-o文件拖入MachOView中
#import "MyObject.h"
@implementation MyObject
- (void)my_init {
char *cStr = "c string is there";
NSString *ocStr = @"oc String is there";
}
@end
新建的類
新增的方法
代碼中的字符串
__DATA,_cfstring中只有oc的字符串
生活如此美好碧注,今天就點到為止。糖赔。萍丐。