Mach-O
- Mach-O是Mach object的缩写,是Mac/IOS上的存储格式、库的标准格式。
常见的Mach-O文件类型
- MH-OBJECT
- 目标文件(.O)
- 静态库文件(.a),静态库其实就是N个.O合并在一起
- MH-EXECUTE:动态库文件;
- MH-DYLIB:动态库文件
- dylib : 动态库文件,用于加载以下几种类型文件:MH_DYLIB、MH_BUNDLE、MH_EXECUTE;
- APP的可执行文件、动态库都是由dyid负责加载的;
- framework/xx
- MH_DYLINKER:动态链接编辑器
- /usr/lib/dyid
- MH_DSYM :存储着二进制文件符号信息的文件
- .DSYM/Contents/Resources/DWARF/xx(常用于分析app的奔溃信息)
Universal Binary(通用二进制文件)
- 通用二进制文件
- 同时使用于各种架构的二进制文件
- 包含了多种不同架构的独立的二进制文件
窥探Mach-O的结构
- 命令行工具
- file:查看Mach-O的文件类型。 file 文件路径
- otool:查看Mach-O特定部分和段的内容
- lipo:常用于多架构Mach-O文件的处理、
- 查看架构信息:lipo -info 文件路径
- 导出某种特定架构:lipo 文件路径 -thin 架构类型 -output 输出文件路径
- 合并多种架构:lipo 文件路径1 文件路径2 -output 输出文件路径
- GUI工具
MachOView : https://github.com/gdbinit/MachOView
Mach-O的基本结构
- 一个Mach-O文件包含3个主要区域
- Header:文件类型、目标架构类型等;
- Load commands:描述文件在虚拟内存中的逻辑结构、布局;
- Raw segment data:在Load commands中定义的Segment的原始数据;
在后续的逆向中,了解Mach-O文件的架构是至关重要的。