Mach-O文件解析

簡介

Mach-O是iOS/OS可執(zhí)行文件。編譯成功后炎咖,找到app文件->顯示包內(nèi)容与纽,即可找到可執(zhí)行文件侣签。


Mach-O

常用指令

  • 查看Mach-O格式
lipo -info <可執(zhí)行文件>
格式
  • 查看Mach-O架構(gòu)
lipo -info <可執(zhí)行文件>
架構(gòu)
  • 查看Mach-O的Header
otool -h <可執(zhí)行文件>
Header1
otool -hv <可執(zhí)行文件>
Header2
  • 查看Mach-O的Load Commands
otool -lv <可執(zhí)行文件>
image.png

Mach-O文件讀取工具M(jìn)achOView

工具下載地址

MachOView

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ù)地址查看


image.png

某些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í)行文件>


image.png

顯示最上面的10行數(shù)據(jù)
otool -tv <可執(zhí)行文件名> |head -n 10


image.png

__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í)行文件名>
image.png

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

新建的類

image.png

新增的方法
image.png

代碼中的字符串
image.png

__DATA,_cfstring中只有oc的字符串
image.png

生活如此美好碧注,今天就點到為止。糖赔。萍丐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市放典,隨后出現(xiàn)的幾起案子逝变,更是在濱河造成了極大的恐慌,老刑警劉巖奋构,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳影,死亡現(xiàn)場離奇詭異,居然都是意外死亡弥臼,警方通過查閱死者的電腦和手機(jī)宴咧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來径缅,“玉大人掺栅,你說我怎么就攤上這事〗娌担” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵茬高,是天一觀的道長兆旬。 經(jīng)常有香客問我,道長怎栽,這世上最難降的妖魔是什么丽猬? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮熏瞄,結(jié)果婚禮上脚祟,老公的妹妹穿的比我還像新娘。我一直安慰自己强饮,他們只是感情好由桌,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邮丰,像睡著了一般行您。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剪廉,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天娃循,我揣著相機(jī)與錄音,去河邊找鬼斗蒋。 笑死捌斧,一個胖子當(dāng)著我的面吹牛笛质,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捞蚂,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妇押,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洞难?” 一聲冷哼從身側(cè)響起舆吮,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎队贱,沒想到半個月后色冀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡柱嫌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年锋恬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片编丘。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡与学,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘉抓,到底是詐尸還是另有隱情索守,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布抑片,位于F島的核電站卵佛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏敞斋。R本人自食惡果不足惜截汪,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望植捎。 院中可真熱鬧衙解,春花似錦、人聲如沸焰枢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽济锄。三九已至枫匾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拟淮,已是汗流浹背干茉。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留很泊,地道東北人角虫。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓沾谓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親戳鹅。 傳聞我的和親對象是個殘疾皇子均驶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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

  • 1. 介紹 Mach-O是Mach Object文件格式的縮寫。它是用于可執(zhí)行文件枫虏,動態(tài)庫妇穴,目標(biāo)代碼的文件格式。作...
    沉江小魚閱讀 806評論 0 1
  • 導(dǎo)論 Mach-o 文件圖解 Mach-o 文件中專有名詞解釋 Mach-o 文件中函數(shù)存儲地址 Mach-o 文...
    ProfessorFan閱讀 2,723評論 2 10
  • Mach-o文件 Mach-O 是iOS/macOS系統(tǒng)上應(yīng)用程序的格式 通用二進(jìn)制文件(胖二進(jìn)制文件) 因為Ma...
    CharType閱讀 977評論 0 2
  • 一隶债、前言 本文簡要解析Mach-O文件格式腾它、結(jié)構(gòu),主要是自己認(rèn)識Mach-O文件死讹,學(xué)習(xí)的一個過程瞒滴,一些地方可能介紹...
    KinKen閱讀 1,624評論 0 4
  • 概述 ??本文檔描述了Mach-O文件格式的結(jié)構(gòu),它被用來存儲程序和庫到硬盤中赞警,作為Mac OS X程序的二進(jìn)制接...
    VenpleD閱讀 1,473評論 0 5