Mach-O文件解析

簡(jiǎn)介

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的平臺(tái)與版本
armv7:cputype-12、cpusubtype-9
arm64:cputype-16777228、cupsubtype-0

filetype:可執(zhí)行文件(2)、庫(kù)文件、Core、內(nèi)核擴(kuò)展
OBJECT(目標(biāo)文件)-1、EXECUTE(可執(zhí)行文件)-2、DYLIB(動(dòng)態(tài)庫(kù))-6

ncmds、sizeofcmds:Load Commands的個(gè)數(shù)和長(zhǎng)度
flags:dyld加載時(shí)需要的標(biāo)志位,PIE表示開啟地址空間隨機(jī)化
Reserved:只有64位時(shí)才存在

  • Load Commands


    image.png

    LC_SEGMENT/LC_SEGMENT_64 - 將文件中(32位或64位)的段映射到進(jìn)程地址空間中
    LC_SYMTAB - 符號(hào)表信息
    LC_DYSYMTAB - 動(dòng)態(tài)符號(hào)表信息
    LC_LOAD_DYLINKER - 加載動(dòng)態(tài)鏈接器(/usr/lib/dyld)
    LC_UUID - 文件的唯一標(biāo)識(shí),crash解析中也會(huì)有,去匹配dysm文件和crash文件
    LC_VERSION_MIN_IPHONEOS - 二進(jìn)制文件要求最低操作系統(tǒng)版本
    LC_MAIN - 設(shè)置程序主線程的入口地址和棧大小
    LC_ENCRYPTION_INFO - 加密信息,查看文件加密信息(otool -l <可執(zhí)行文件> | grep cryptid)
    LC_LOAD_DYLIB - 加載的動(dòng)態(tài)庫(kù),包括動(dòng)態(tài)庫(kù)地址和名稱,當(dāng)前版本號(hào),兼容版本號(hào)(otool -l <可執(zhí)行文件>)
    LC_FUNCTION_STARTS - 函數(shù)起始地址表
    LC_CODE_SIGNATURE - 代碼簽名信息

main函數(shù)地址查看


image.png

某些Segment中包含Section,Section是具體數(shù)據(jù)存放的地方
__TEXT中節(jié)分類:
__text - 主程序代碼
__stub_helper - 用于動(dòng)態(tài)鏈接的存根
__picsymbolstub4 - 用于動(dòng)態(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輔助鏈接(程序在加載時(shí),符號(hào)的地址沒有對(duì)應(yīng)到真實(shí)的地址,只有在第一次使用這個(gè)符號(hào)時(shí),才會(huì)去匹配這個(gè)符號(hào)的地址,第二次使用時(shí)就可以直接找到)
__nl_symbol_ptr - 非延遲加載節(jié)(程序在加載時(shí),符號(hào)的地址已經(jīng)確定下來,使用時(shí)可以直接找到)
__mod_init_func - 初始化的全局函數(shù)的地址,會(huì)在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真實(shí)偏移的計(jì)算(以armv7為例)
    將可執(zhí)行文件,拖入Mach-OView中


    image.png

    armv7起始偏移:16384->0x4000


    image.png

    Section Header偏移:24936->0x6168
    image.png

    Section(__TEXT,__text)真實(shí)偏移: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

生活如此美好,今天就點(diǎn)到為止。。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容