Mach-o文件格式

Mach-O简介:

Mach-O是Mach object的缩写,是Mac\iOS上用于存储程序、库的标准格式.常见的Mach-O文件比如iOS开发好的代码打包好后就是Mach-O格式的文件.

Apple中定义的Mach-O文件包含图一中几种:

1

常见的几种Mach-O文件:

a、目标文件(.o)

b、静态库文件(.a),静态库其实就是N个.o合并在一起

MH_EXECUTE:可执行文件

a、.app/xx

MH_DYLIB:动态库文件

a、.dylib

b、.framework/xx

MH_DYLINKER:动态链接编辑器

a、/usr/lib/dyld

MH_DSYM:存储着二进制文件符号信息的文件

a、.dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩溃信息)

Mach-O的基本结构:

主要包含三个部分:

Header部分:保存了该文件的一些基本信息,如平台,文件类型,加载命令的个数等

loadCommends部分:根据这里的数据来确定内存的分布

Data部分:存放具体的代码和数据,data部分是以段来划分的,loadCommends部分的Segment command对应Data中的Segment

segment

Header:

1


2

Header的第一行的file offset为0,Data为4个字节(2个16进制代表一个字节),第二行file offset为4,Data为4个字节

Load Commands:

loadCommand是用于加载指令的,它的大小和数目在header中已经被提供,在Mach.h下以loadCommand结构体展示


1

load_commands紧跟mach_header

2

VM Address:虚拟内存的地址

VM Size:虚拟内存的size,这里转为16进制为100000000

File Offset:相对于mach-o文件Data数据的偏移量

File Size:就是数据大小,就__PAGEZERO有些特殊,File Size为0代表实际占用mach-o为0,但是它描述了占用虚拟内存的大小,就是上面的4294967296


3

VM Address:虚拟内存的地址

VM Size:虚拟内存的size

File Offset:相对于mach-o文件Data数据的偏移量

File Size:File Size代表实际占用mach-o的大小


4

Address:该段在文件中的实际地址+adsr

Size:段大小

Offset:该段在文件中的实际地址

segment段类型如下:

1:__PAGEZERO段: 空指针陷阱段,映射到虚拟内存空间的第一页,用于捕捉对NULL指针的引用;

2: __TEXT 段: 包含了执行代码以及其他只读数据。 为了让内核将它 直接从可执行文件映射到共享内存, 静态连接器设置该段的虚拟内存权限为不允许写。当这个段被映射到内存后,可以被所有进程共享。(这主要用在frameworks, bundles和共享库等程序中,也可以为同一个可执行文件的多个进程拷贝使用)

3: __DATA段: 包含了程序数据,该段可写;

4: __OBJC段: Objective-C运行时支持库;

5: __LINKEDIT段: 含有为动态链接库使用的原始数据,比如符号,字符串,重定位表条目等等。

每种类型的段又会按不同的功能划分为几个区(section, 名称小写,加两个下横线作为前缀)如下:

TEXT 段中的section具体类型和作用:

_text:只有可执行机器码(主程序代码)

_cstring: 去重后的c字符串

_const: 初始化的常量

_stubs: 符号桩,本质上就是一小段会直接跳入到lazybinding的表的对应项指针指向的地址的代码(???)

_stubs_helper: 辅助函数,上述lazybinding表中没有找到符号地址都指向这

_unwind_info:用于存储异常请况信息>

_eh_frame 调试辅助信息

DATA 段中section的具体类型和作用

_data :初始化过得可变的数据,即全局变量和静态变量的存储是放在一块的,都放在全局区(静态区),初始化的全局变量和静态变量在一块区域

_const: 没有初始化过得常量

_bss: 没有初始化的静态变量

_common: 没有初始化过的符号声明

_mod_init_func : 初始化函数:在main之前调用

_mod_term_func: 终止函数,在main返回之后调用

_nl_symbol_ptr:  在非lazy-binding的指针表中 的每个表项中的指针都指向一个在装载过程中,被动态链机器搜索完成的符号(符号的指针)

__la_symbol_ptr:lazy-binding的指针表,每个表项中的指针一开始指向stub_helper(没有找到的符号指针)

注意: 虽然段类型是不一样的,但是加载都是使用LC_SEGMENT_64 这个命令, 只是其中加载的段的信息不同

1

__text: 主程序代码

__stubs, __stub_helper: 用于动态链接的桩

__cstring: 程序中c语言字符串

__const: 常量

__TEXT,__objc_methname:OC方法名称

__TEXT__objc_methtype:OC方法类型

__TEXT__objc_classname:OC类名

__DATA,__objc_classlist:OC类列表

__DATA,__objc_protollist:OC原型列表

__DATA,__objc_imageinfo:OC镜像信息

__DATA,__objc_const:OC常量

__DATA,__objc_selfrefs:OC类自引用(self)

__DATA,__objc_superrefs:OC类超类引用(super)

__DATA,__objc_protolrefs:OC原型引用

__DATA, __bss: 没有初始化和初始化为0 的全局变量

Dynamic Loader Info:动态链接器所需要使用的信息(重定向,符号绑定,懒加载绑定等..)

后续的信息就是函数起始位置,符号表,字符表,代码签名等.



查看Mach-O信息:

1.查看Mach-O的文件类型

$ file Mach-O文件路径

例如查看APP支持的架构(arm64或者32)如图


1

2.查看Mach-O的特定部分如图四(头信息或者段信息)

$ otool -h Mach-O文件路径//查看头信息

$ otool -l Mach-O文件路径 | grep cryptid//查看Mach-O文件路径文件是否加密


1

3.多架构Mach-O文件的处理,可以将arm64和32分开,合并

$ lipo -info 文件路径//看架构信息

$ lipo 文件路径 -thin 架构类型 -output 输出文件路径//导出某种特定架构

$ lipo 文件路径1文件路径2-output 输出文件路径//合并多种架构

Mach-o文件详解:

ASLR:

地址空间布局随机化,是一种避免app被攻击的有效保护;进程每次启动时,地址空间都会被简单地随机化——只是偏移,不是搅乱。实现方式是通过内核将Mach-O的段“平移”某个随机数;

真正的内存地址则是vmaddr + ALSR

https://www.jianshu.com/p/37f10bb70c50

https://www.exchen.net/mach-o-文件格式解析.html

相关工具:

Mach-OGUI查看工具Mach-OView

MachOView下载编译即可.

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

推荐阅读更多精彩内容