Mach-O文件初了解

1 什么是Mach-O

Mach-O其实是Mach Object文件格式的缩写,是mac以及iOS上可执行文件的格式, 类似于windows上的PE格式 (Portable Executable ), linux上的elf格式 (Executable and Linking Format)。
如果我们想对 Mach -O 文件有所了解,可以将我们打包好的 ipa 文件后缀改成 .zip,然后解压生成 Payload 文件,在其中就可以找到 exec 文件。或者找一个动态库的 framework 在其中也可以找到 exec 文件。

常见的MachO文件:

  • 目标文件:.o
  • 库文件:.a .dylib Framework
  • 可执行文件:dyld .dsym

如何查看文件格式

file [文件路径/文件名]
image.png

2 MachOView

官网直接下载的MachOView.app打开后不停闪退,因此最好是直接去下载源码然后编译出来使用。
MachOView GitHub地址
下载后记得修改源码:

image.png

3 MachO文件结构

使用MachOView打开两个Xcode编译后生成的app可执行文件,文件结构分别如下:


x86_64.png
armv7 and arm64.png

根据图可以看出,同时支持多种指令集的MachO文件会针对每个指令集生成一个Executable,每一个Executable里的文件结构又是一样的。下面我们针对Executable文件来分析,先看一张官网的MachO文件结构图,可看出MachO文件主要由三部分组成:

  • Header
  • Load Commons
  • Data


    image.png

3.1 Mach Header

选取了Mach64 Header来分析,图中未红字表明的flags表示的是标示位,主要与系统的加载、链接相关:


image.png

3.2 Load Commands

Load commands是一张包含很多内容的表,内容包括区域的位置、符号表、动态符号表等。这里就是二进制文件加载进内存要执行的一些指令。这里的指令主要在负责我们 APP 对应进程的创建和基本设置(分配虚拟内存,创建主线程,处理代码签名/加密的工作),然后对动态链接库(.dylib 系统库和我们自己创建的动态库)进行库加载和符号解析的工作。

字段名称及意义分别如下:

名称 含义
LC_SEGMENT_64 将文件中(32位或64位)的段映射到进程地址空间中
LC_DYLD_INFO_ONLY 动态链接相关信息
LC_SYMTAB 符号地址
LC_DYSYMTAB 动态符号表地址
LC_LOAD_DYLINKER 使用谁加载,我们使用dyld
LC_UUID 文件的UUID
LC_VERSION_MIN_MACOSX 支持最低的操作系统版本
LC_SOURCE_VERSION 源代码版本
LC_MAIN 设置程序主线程的入口地址和栈大小
LC_LOAD_DYLIB 依赖库的路径,包含三方库
LC_FUNCTION_STARTS 函数起始地址表
LC_CODE_SIGNATURE 代码签名

首先看下Load Commands目录结构:

image.png

从上图可知 Load Commands 主要包含了有多个 Segment 段,每个中又包含了多个 Section 段。每一部分都是系统执行指令。其中 LC_SEGMENT 包含空指针陷阱
__TEXT段主要包含程序代码和只读的常量,这个段的内容如果是系统动态库的内容那么所有进程公用
__DATA 段主要包含全局变量和静态变量,这个段的内容每个进程单独进行维护
__LINKEDIT 主要包含链接器使用的符号和其他的表(比如函数名称、地址等) 这个段的内容也是可以多进程公用的。

此外还需介绍下和 SEGMENT 并列的一些比较重要的指令:

  • LC_LOAD_DYLINKER 该字段标明我们的MachO是被谁加载进去的。
    可以理解为LC_LOAD_DYLINKER指向的地址是微信APP加载小程序的引擎,而我们的MachO是小程序。在上图中可以看到我们的Demo1的LC_LOAD_DYLINKER指向的地址就是dylddyld确实是用来加载我们app的。

  • LC_LOAD_DYLIB
    该字段标记了所有动态库的地址,只有在LC_LOAD_DYLIB中有标记,我们MachO外部的动态库(如:Framework)才能被dyld正确的引用,否则dyld不会主动加载。(因此很多通过这个知识点来做代码注入

  • LC_MAIN 是在所有的库都加载完成后,有其中的指令启动程序的主线程。我们的程序也是在这个函数之后才开始执行 main() 函数的。

  • LC_CODE_SIGNATURE 我想每个 iOSer 都知道代码签名的机制,其实代码签名的校验也是在这个指令下进行。实际上指令会把整个文件进行 hash 化处理并签名,在运行时去验证签名的正确性。

3.3 Data

Data 通常是对象文件中最大的部分,包含Segement的具体数据,如静态C字符串,带参数/不带参数的OC方法,带参数/不带参数的C函数。

可以看到,全局静态C字符,方法里面的字符串都被保存在data段的cstring里了,哪怕是%d,%s等等这样的参数类型字符串也被保存在内,但所有同样的字符串只会被保存一次:


cstring.png

同样所有的OC方法都被保存在methname里了:


methname.png

4 结语

暂时通过MachOView初步窥探了一下MachO文件的结构,理解MachO文件结构是对后续学习MachO文件加载、dyld等建立知识基础。好多知识对于自己目前的知识水平感觉真的是看着像都懂了,但一问细节却又什么都不懂,书读百遍其义自见吧。
参考文章:
iOS逆向(5)-不知MachO怎敢说自己懂DYLD
理解 Mach-O 并提高程序启动速度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342