四 iOS逆向- Mach-O

  • Mach-O文件類型
  • Mach-O文件基本結(jié)構(gòu)
  • 通用二進(jìn)制文件

Mach-O是Mach object的縮寫,是Mac\iOS上用于存儲(chǔ)程序、庫(kù)的標(biāo)準(zhǔn)格式

一 Mach-O文件類型
#define MH_OBJECT   0x1     /* 目標(biāo)文件*/
#define MH_EXECUTE  0x2     /* 可執(zhí)行文件 */
#define MH_FVMLIB   0x3     /* fixed VM shared library file */
#define MH_CORE     0x4     /*核心轉(zhuǎn)儲(chǔ)文件 */
#define MH_PRELOAD  0x5     /* preloaded executable file */
#define MH_DYLIB    0x6     /* dynamically bound shared library */
#define MH_DYLINKER 0x7     /* dynamic link editor */
#define MH_BUNDLE   0x8     /* dynamically bound bundle file */
#define MH_DYLIB_STUB   0x9     /* shared library stub for static */
                    /*  linking only, no section contents */
#define MH_DSYM     0xa     /* companion file with only debug */
                    /*  sections */
#define MH_KEXT_BUNDLE  0xb     /* x86_64 kexts */

可以在xnu源碼中,查看到Mach-O格式的詳細(xì)定義(https://opensource.apple.com/tarballs/xnu/

  • EXTERNAL_HEADERS/mach-o/fat.h

  • EXTERNAL_HEADERS/mach-o/loader.h


    Mach-O格式定義文件所在位置

Mach-O文件的格式還是挺多的,我們簡(jiǎn)單的了解一下常用的一些類型。

1 MH_OBJECT
  • 目標(biāo)文件(.o)
  • 靜態(tài)庫(kù)文件(.a),靜態(tài)庫(kù)其實(shí)就是N個(gè).o合并在一起
    我們常用的目標(biāo)文件正勒,靜態(tài)庫(kù)都是Mach-O格式的
2 MH_EXECUTE:可執(zhí)行文件
  • .app/xx
    app里面的可執(zhí)行文件也是Mach-O格式的
3 MH_DYLIB:動(dòng)態(tài)庫(kù)文件
  • .dylib
  • .framework/xx
    動(dòng)態(tài)庫(kù)文件也是Mach-O格式的
4 MH_DYLINKER:動(dòng)態(tài)鏈接編輯器
5 MH_DSYM:存儲(chǔ)著二進(jìn)制文件符號(hào)信息的文件
  • .dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩潰信息)
    我們常用與分析app奔潰信息的符號(hào)表文件也是Mach-O格式的。
2 如何查看Mach-O格式的文件

1 使用MachOView工具
下載地址:https://github.com/gdbinit/MachOView

2 otool:查看Mach-O特定部分和段的內(nèi)容

xmldeMacBook-Pro:iOS學(xué)習(xí) xml$ otool
Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool [-arch arch_type] [-fahlLDtdorSTMRIHGvVcXmqQjCP] [-mcpu=arg] [--version] <object file> ...
    -f print the fat headers
    -a print the archive header
    -h print the mach header
    -l print the load commands
    -L print shared libraries used
    -D print shared library id name
    -t print the text section (disassemble with -v)
    -p <routine name>  start dissassemble from routine name
    -s <segname> <sectname> print contents of section
    -d print the data section
    -o print the Objective-C segment
    -r print the relocation entries
    -S print the table of contents of a library (obsolete)
    -T print the table of contents of a dynamic shared library (obsolete)
    -M print the module table of a dynamic shared library (obsolete)
    -R print the reference table of a dynamic shared library (obsolete)
    -I print the indirect symbol table
    -H print the two-level hints table (obsolete)
    -G print the data in code table
    -v print verbosely (symbolically) when possible
    -V print disassembled operands symbolically
    -c print argument strings of a core file
    -X print no leading addresses or headers
    -m don't use archive(member) syntax
    -B force Thumb disassembly (ARM objects only)
    -q use llvm's disassembler (the default)
    -Q use otool(1)'s disassembler
    -mcpu=arg use `arg' as the cpu for disassembly
    -j print opcode bytes
    -P print the info plist section as strings
    -C print linker optimization hints
    --version print the version of /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool
xmldeMacBook-Pro:iOS學(xué)習(xí) xml$ otool -h Calculator
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedfacf 16777228          0  0x00           2    36       5016 0x00200085
二 Mach-O文件基本結(jié)構(gòu)

Mach-O文件包含3個(gè)主要區(qū)域

1 Header

文件類型傻铣、目標(biāo)架構(gòu)類型等

2 Load commands

描述文件在虛擬內(nèi)存中的邏輯結(jié)構(gòu)章贞、布局

3 Raw segment data

在Load commands中定義的Segment的原始數(shù)據(jù)

具體文件Mach-O格式展示

具體每一項(xiàng)的含義可參看官方文檔:https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html

了解Mach-O文件的細(xì)節(jié),是我們逆向工程的基礎(chǔ)非洲,無(wú)論是我們用class_dump導(dǎo)出頭文件鸭限,還是使用hopper disassembler分析代碼實(shí)現(xiàn),都是要用到Mach-O的知識(shí)两踏。其實(shí)它們都是在根據(jù)Mach-O文件的格式里覆,做了圖形化的展示。

三 通用二進(jìn)制文件

mac系統(tǒng)所支持的cpu及硬件平臺(tái)發(fā)生了很大的變化缆瓣,為了解決軟件在多個(gè)硬件平臺(tái)上的兼容性問(wèn)題喧枷,蘋果開發(fā)了一個(gè)通用的二進(jìn)制文件格式(Universal Binary),又稱胖二進(jìn)制(Fat Binary)。

我們可以通過(guò)file命令來(lái)查看這種通用二進(jìn)制文件:

系統(tǒng)還提供了一個(gè)命令行工具lipo來(lái)操作通用二進(jìn)制文件弓坞。它可以添加隧甚,提取,刪除以及替換通用二進(jìn)制文件中特定架構(gòu)的二進(jìn)制文件渡冻。
下面我們來(lái)探討一下胖二進(jìn)制的格式戚扳,其頭部結(jié)構(gòu)fat_header定義如下:

#define FAT_MAGIC    0xcafebabe
#define FAT_CIGAM    0xbebafeca    

struct fat_header {
    uint32_t    magic;        
    uint32_t    nfat_arch;    
};

magic字段被定義為常量FAT_MAGIC,表示這是一個(gè)胖二進(jìn)制族吻,nfat_arch表示有多少個(gè)Mach-O文件帽借。
每個(gè)胖二進(jìn)制都用fat_arch結(jié)構(gòu)表示珠增,在fat_header之后,緊接著一個(gè)或多個(gè)連續(xù)的fat_arch結(jié)構(gòu)體砍艾。

struct fat_arch {
    cpu_type_t    cputype;    
    cpu_subtype_t    cpusubtype;   
    uint32_t    offset;        
    uint32_t    size;        
    uint32_t    align;        
};

cputype指定了CPU類型蒂教,cpusubtype指定了CPU的子類型,offset指定了當(dāng)前CPU架構(gòu)數(shù)據(jù)相對(duì)于當(dāng)前文件開頭的偏移值脆荷,size字段指明了數(shù)據(jù)的大小凝垛。align字段指明了數(shù)據(jù)的內(nèi)存對(duì)齊邊界,取值必須是2的次方蜓谋,它確保了當(dāng)前CPU架構(gòu)的目標(biāo)文件在加載到內(nèi)存中時(shí)梦皮,數(shù)據(jù)是經(jīng)過(guò)內(nèi)存優(yōu)化對(duì)齊的。

1 用otool來(lái)查看fat_header信息桃焕。

2 用lipo來(lái)抽取或合并胖二進(jìn)制文件
  • 查看架構(gòu)信息:lipo -info 文件路徑
  • 導(dǎo)出某種特定架構(gòu):lipo 文件路徑 -thin 架構(gòu)類型 -output 輸出文件路徑
  • 合并多種架構(gòu):lipo 文件路徑1 文件路徑2 -output 輸出文件路徑
    這個(gè)Mach-O比較重要應(yīng)該屬于逆相中基礎(chǔ)儲(chǔ)備知識(shí)剑肯,多了解它,我們才能進(jìn)行后續(xù)的工作观堂。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末让网,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子型将,更是在濱河造成了極大的恐慌,老刑警劉巖荐虐,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件七兜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡福扬,警方通過(guò)查閱死者的電腦和手機(jī)腕铸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铛碑,“玉大人狠裹,你說(shuō)我怎么就攤上這事∑常” “怎么了涛菠?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)撇吞。 經(jīng)常有香客問(wèn)我俗冻,道長(zhǎng),這世上最難降的妖魔是什么牍颈? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任迄薄,我火速辦了婚禮,結(jié)果婚禮上煮岁,老公的妹妹穿的比我還像新娘讥蔽。我一直安慰自己涣易,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布冶伞。 她就那樣靜靜地躺著新症,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碰缔。 梳的紋絲不亂的頭發(fā)上账劲,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音金抡,去河邊找鬼瀑焦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梗肝,可吹牛的內(nèi)容都是我干的榛瓮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼巫击,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼禀晓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坝锰,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粹懒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后顷级,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凫乖,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年弓颈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帽芽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翔冀,死狀恐怖导街,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纤子,我是刑警寧澤搬瑰,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站控硼,受9級(jí)特大地震影響跌捆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜象颖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一佩厚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧说订,春花似錦抄瓦、人聲如沸潮瓶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毯辅。三九已至,卻和暖如春煞额,著一層夾襖步出監(jiān)牢的瞬間思恐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工膊毁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胀莹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓婚温,卻偏偏與公主長(zhǎng)得像描焰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栅螟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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