Mach-O文件内部揭秘

在windows上可执行文件的格式是exe,在Linux上ELF是可执行文件,而在苹果系统上,Mac OS X和ios系统上,可执行文件的格式是Mach-O格式。官方解释地址:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html

1、Mach与Mach-O

这里先提醒大家一下,Mach不是Mac,Mac是苹果电脑Macintosh的简称,而Mach则是一种操作系统内核。Mach内核被NeXT公司的NeXTSTEP操作系统使用。在Mach上,一种可执行的文件格是就是Mach-O(Mach Object file format)。Mac OS X是Unix的“后代”,但所主要支持的可执行文件格式是Mach-O。

iOS是从OS X演变而来,所以同样是支持Mach-O格式的可执行文件。

2、ios可执行文件初探

作为ios开发者,我们比较熟悉ipa包,这种文件格式,然而,实际上这只是一个变相的zip的压缩包。我们将其解压之后发现


这其实是一个Payload的包 打开这个包 不能发现 这是一个test1.app的文件 也就是xcode生成的product文件

而这其实也就是一个文件夹,打开这个文件夹(显示包含内容)发现其中有一个同名的test1的可执行文件,这就是我们最终要寻找的在ios上的可执行文件

我们用file命令来查看这个文件的文件类型


这是一个64位的Mach-O 格式的可执行文件


3、Mach-O文件细究

根据苹果官方文档提供Mach-O文件的数据主体可分为三个部分


头部(Header)、加载命令(Load Commands)、数据(Data)

而数据部分则又被分割成了一段段的Segments。

下面我们使用otool工具来一探究竟

a) 先来查看下这个可执行文件的头部是怎样的


一堆看不明白的东西,分别予以解释

magic:0xfeedfacf 。这个东西是Mach-O的魔数。简单介绍下什么叫做魔数:很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)。根据这几个字节的内容就可以确定文件类型,因此这几个字节的内容被称为魔数 (magic number)。

在OS X上 可执行文件的标识有这样几个魔数:cafebabe、feedface、feadfacf、还有就是以#!开头的。

cputype、cpusubtype:指的是CPU类型和CPU子类型

在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/mach里找到machine.h的定义 如下图


这里有支持的cpu的详细编号命名 0代表ARM的格式都将支持

caps: 额 官网上都没介绍 这个待查

filetype 2:代表可执行文件

ncmds:指的是加载命令(load commands)的数量,例子中一共22个,编号0-21

sizeofcmds:表示要load的22个commands的总的大小

flags:可用来检验是否开启了PIE,如开启了则需要移除方能正常使用MachOView才能把文件结构检测出来

它有这么几种定义值:我们的文件无未定义引用 (MH_NOUNDEFS),是为动态链接器(MH_DYLDLINK),使用two-level名Cheng绑定(MH_TWOLEVEL)且应被加载到随机地址 (MH_PIE).

b)再来看加载命令(Load Commands) 截取其中一个Commands来分析


Load command 0 :command编号

cmdLC_SEGMENT_64:即是将文件中的段映射进内存中的地址空间

segname:16字节段名称

vmaddr:段虚拟内存的起始地址

vmsize:段虚拟内存的大小

fileoff:段在内存中的偏移量

filesize:段在文件中的大小

maxprot:段页面所需要的最高内存保护

initprot:段页面初始内存保护

nsects:段中包含section的数量

flags:其他杂项标志位

c)接下来看data,注意到command和data都是以segment为大单元字节,但是在data里还有section字节 所以重点介绍section的组织格式 截取一个section供分析


sectname:section的名字

segname:section归属为哪一个segment

addr:secction起始内存地址

size:section的大小

offset:该section的文件偏移量

align:字节大小对齐

reloff:重定位入口的文件偏移

nreloc:需要重定位的入口数量

flags:包含了section的类型和独自的属性

最后两项保留用

了解了这些 才能根据Mach-O的文件结构 去分析类的名称和类的方法 即是class-dump的实现原理,同时这也是MachOView等的分析原理

参考自:http://turingh.github.io/2016/03/07/mach-o%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E5%88%86%E6%9E%90/

附上otool命令大全

-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   start dissassemble from routine name

-s 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

-T print the table of contents of a dynamic shared library

-M print the module table of a dynamic shared library

-R print the reference table of a dynamic shared library

-I print the indirect symbol table

-H print the two-level hints table

-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

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

推荐阅读更多精彩内容