Mach-O详解(一) - 破题

什么是Mach-O

Mach-O: Mach Object

布拉布拉.....,概念没意思,反正就是一可执行文件

ios中的常见的.o .a .dylib Framework dyld dsym 都是Mach-O

抽象概念

是一种可执行文件,用于目标代码,动态库,内核转储

每个Mach-O文件包括一个Mach-O头,一系列的载入命令,多个块

image.png
  • Mach Header: 描述 Mach-O 的CPU架构、文件类型、加载命令等信息

    • Magic Number 32位/64位架构

    • File Type 文件类型 - 其实就是可执行文件

    • Number of Load Commands 加载的Commands有多少个命令

    • Size of Load Commands 加载命令的内存大小

    • Flags 标识 系统加载有没有关系/链接/两级命名空间(通过两级命名空间将符号编码成 对象:符号 的两级名字,这样不同的动态库就避免了符号冲突)....

  • Load Commands: 描述文件中数据等具体组织结构,不同数据类型使用不同等加载命令表示

    • 其实就是一张包含很多内容的表,内容包括区域的位置、符号表、动态符号表等
    • LC_SEGMENT_64 将文件中(32位或64位)的段映射到进程地址空间中
      • 当然了,点开 LC_SEGMENT_64,还会看见更细节的内容,命令的执行需要依赖一些记录信息 代码 常量 其他数据类型等等 比如 LC_SEGMENT_64 类型的加载命令

      • VM Address 虚拟地址

      • VM Size 虚拟地址大小

      • File Offset 文件偏移

      • File size 文件大小

      • Maximum VM Protection 就是最大能使用的大小,因为不能操作物理内存,系统会分配一个最大的进程空间,只能通过虚拟空间 + offset的方式去映射物理内存,永远不会超过系统分配的边界

      • Number of Sections 加载进内存的section数量

- 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 代码签名
  • Data: Data中每一个段(Segment)的数据保存在此,段用来存放数据和代码
    • Data 区主要就是负责代码和数据记录的

    • Mach-O 是以 Segment 这种结构来组织数据的, 一个 Segment 可以包含 0 个或多个 Section

    • Segment 中 section 就可以被解读为是代码,常量或者一些其他的数据类型

    • 在装载在内存中时,也是根据 Segment 做内存映射的

    • TEXT.text: 机器码

    • TEXT.cstring: 硬编码的字符串

    • TEXT.const: 初始化过的常量

    • DATA.data: 初始化过的可变的(静态/全局)数据

    • DATA.const: 没有初始化过的常量

    • DATA.bss: 没有初始化过的 (静态/全局)变量

    • DATA.common: 没有初始化过的符号声明

    • Section64(__TEXT,__text) 存放的就是代码的指令 汇编指令

    • Section64(__TEXT,cstring) 存放的就是硬编码的字符串

    • Section64(__DATA_CONST,__objc_classlist) OC中的类都记录在此section

    • Section64(__TEXT,__swift5_types) swift中的类都记录在此section 包含结构体 enumor 或者 类的descriptor(地址信息)

操作一番,稍微看下具体mach-o 与 实际代码中关系

目前操作的是swift代码,此篇博客重在初步感知下Mach-O,所以具体swift的类结构暂不涉及

此后会专门写博客探究源码层面的结构

image.png

拿出计算器,当前是arm架构,小端模式

image.png

得到一个地址 , 此时发现前缀是个 0x100000000 这样的地址

在ios中,这个地址是 常量数据的存放地址, 验证一下

image.png

通过lldb调试,image list,读取镜像,得到虚拟偏移首地址,这里跟 上面Mach-O PageZero中记录的虚拟内存首地址 不一样,只是此处恰好相等而已

image.png

现在用计算器中的值 减去Mach-O中读取的虚拟首地址, 得到0x3E0C,

上Mach-O Segments部分 常量Section里看下

image.png

这里读出的偏移地址 0x00AC 与 前面得到的 0x3E0C 相加,得到 0x3EB8

这个结果 加上 刚才app启动时,lldb - image list拿到的偏移地址 0x100000000

(再次注意 - 这个值跟Mach-O中 虚拟首地址不一样,只是恰好相等了而已,Mach-O中的那个值是固定的,而此处的之个虚拟首地址值每次启动app都会变,就是所谓的ASLR,随机偏移地址)

得到 0x100003EB8, 回到调试,打开汇编,读下寄存器

--- 失败,刚才调试,类没有定义方法,临时加了一个 test_func(), 只好复刻下上面的操作,有的时候,事情总出点纰漏,出错不怕,能补漏就好

复习一遍

__swift5_types 中的 基址 + 相对地址

image.png

减去 PageZero中记录的虚拟地址首地址 得到 0x3DFC

image.png

上面得到的 0x0012 的 (基址0x3E30 + ASLR(app启动内存随机偏移 0x100000000) + 4字节偏移 + 得到的0x0012) = 0x3E46

具体是不是这样呢,时间关系,下一篇博客我通过寄存器验证,然后紧接着从验证结果入手,分析swift中的底层结构

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

推荐阅读更多精彩内容