1.Mach-O其实是Mach Object文件格式的缩写,它是Mac以及iOS上一种用于可执行文件、目标代码、动态库的文件格式,类似于Windows上面的PE格式(Portable Executable),linux上的elf格式(Executable and Link Format)。
2.它是一种用于可执行文件、目标代码、动态库的文件格式,作为.out格式的替代,MachO提供了更强的扩展性。
二、Mach-O文件格式目标文件.o
库文件:.a .dylib .Framework
可执行文件
dyld(动态链接器)
.dsym(符号表:Relese环境运行生成)
三、Mach-O格式Mach-O是一个以数据块分组的二进制字节流,这些数据块包含元信息,比如字节顺序、CPU类型、数据块大小等等。
典型的Mach-O文件包含三个区域:
1.Header:保存Mach-O的一些基本信息,包括平台、文件类型、指令数、指令总大小,dyld标记Flags等等。
2.Load Commands:紧跟Header,加载Mach-O文件时会使用这部分数据确定内存分布,对系统内核加载器和动态连接器起指导作用。
3.Data:每个segment的具体数据保存在这里,包含具体的代码、数据等等
使用 MachOView 打开会看到通用二进制文件由 Fat Header 和可执行文件组成(可执行文件是由 Header 、 Load commands 和 Data 组成);
1.Header部分
Header部分(包含该二进制文件的一般信息):字节顺序、架构类型、加载指令的数量等。使得可以快速确认一些信息,比如当前文件用于32位还是64位,对应处理器是什么,文件类型是什么。
2.load commands部分load commands 是一张包括区域的位置、符号表、动态符号表等内容的表。它详细保存着加载指令的内容,告诉链接器如何去加载这个 Mach-O 文件。通过查看内存地址发现,在内存中 load commands 是紧跟在 header 之后的;
部分字段说明:
3.data部分
data 是MachO文件中最大的部分,其中 _TEXT段 、 _DATA段 能给到很多信息。load commands 和 data 之间还留有不少空间,给我们留下了注入代码的冲破口
_TEXT段名称 | 作用 |
---|---|
_text | 主程序代码 |
_stubs、_stub_helper | 动态链接 |
_objc_methodname | 方法名称 |
_objc_classname | 类名称 |
_objc_methtype | 方法类型 |
_cstring | 静态字符串常量 |
_DATA段名称 | 作用 |
---|---|
_got=Non-Lazy Symbol Pointers | 非懒加载符号表 |
_la_symbol_ptr => Lazy Symbol Pointers | 懒加载符号表 |
_objc_classlist | 方法名称 |
点击链接下载:
2.MachoView使用打开MachoView,点击左上角File 选中Open选择可执行文件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)