06.MachO文件
一、基础概念
Mach-O文件其实是MachObject文件格式的缩写。是Mac以及iOS上客户性文件的格式。
属于MachO格式的常见文件:
目标文件.o
库文件
.a
.dylib
Framework
可执行文件
dyld
.dsym
file指令可以产看文件类型
二、我们通过一个简单的例子来看下MachO是怎么生成的
Test.c
# include <stdio.h>
int main() {
printf("Hello world");
return 1;
}Test2.c
2.1 源文件编译为.o文件(中间对象文件)
执行命令clang -c Test.c Test2.c

看到编译出了两个对应的.o文件
可以直接 -o 一步到位
2.2 将.o文件生成可执行文件
执行命名clang -o TestEx Test.o Test2.o
生成TestEx的可执行文件,通过file指令确认一下,这里可以发现生成的就是MachO文件了
2.3 链接顺序对MachO文件的影响
我们看下当前生成TestEx文件的MD5
再执行命名clang -o TestEx2 Test2.o Test.o,调整.o文件顺序。
通过objdump查看MachO文件数据
可以确定生成的MachO文件不同了。
MachO是一系列.o文件的集合
三:MachO文件结构
3.1 Header
包含了二进制文件的一般信息
字节顺序、架构类型、加载指令的数量等
使得一些信息可以快速确认
比如当前文件是用于32位还是64位,对应的处理器是什么、文件类型是什么
Header数据结构
可以再Xcode中快速打开文件
Loader.h查看,这个文件时学习MachO非常好的一个入口!
magic 快速定位是64位还是32位 cputype CPU类型,比如ARM cpusubtype CPU具体类型,比如:arm64/armv7 filetype 文件类型,比如:可执行文件 ncmds LoadCommands条数 sizeofcmds LoadCommands大小 flags 标志位,标识二进制文件支持的功能。主要是和系统加载、链接有关。
使用otool查看Header内容
otool查看Header内容3.2 Load commands
内容包括区域的位置、符号表、动态符号表等
Rebase info offset
MachO文件在加载到内存中后(虚拟内存),会被分配一个随机的偏移值ASLR。 我们使用静态分析工具看到的并不是真实的内存地址。
查看当前ASLR

命令image list -o -f | grep 当前MachO文件名
ASLR 0x0000000000118000 (随机的每次都不一样) 真实地址 0x10011e640
用工具查看地址
0x0000000100006640
计算真实地址
ASLR+工具显示的地址使用编程计算器验证成功!
使用otool查看Load commands内容
otool查看Load commands内容3.3 Data
通常是文件中最大的部分
包含Segement的具体数据
Last updated
Was this helpful?