定义
- MachO属于一种文件格式
- 包含:可执行文件、静态库、动态库、dyld等库
- 可执行文件
- 通用二进制文件(fat):集合了多种架构
- lipo命令
- -thin 拆分架构
- -create 合并架构
- MachO结构
- Header
- 用于快速确定该文件的CPU类型,文件类型
- Load Commands
- 指示加载器如何设置并加载二进制数据
- Data(详细数据)
- 存放数据:代码段、数据段、字符串常量、类、方法等
- Header
代码注入
Framework注入、Dylib注入
分析思路
- 动态调试:界面入手
静态分析:class-dump (头文件)OC的类、方法列表
MethodSwizzle(RunTime) - 重点
exchange函数交换SEL与IMP的对应关系(书的目录)
- 隐患:回不去!!!(没法调用原来的实现!)所以一般写在分类中,保证调回去
- 解决方法
- 添加方法列表 解决 - 过程比较复杂
- replace函数替换IMP
- getIMP和getImp配合,推荐——>logos语法,底层就是setImp和getImp
- 临时存储旧getImp,设置新setImp,再调回旧getImp
Mach-O结构图
结构详解
- dyld加载Mach-o文件,首先读取Mach-o header
- 然后读取load commands(可以知道应用程序所有信息),包含了PAGEZERO、TEXT、DATA、LINKEDIT…
- 加载其它库时,通过LC_LOAD_DYLIB (库名称) -> rePath找到地址,dyld就会去加载这个库
- 因此注入代码可以插入自己的动态库,让dyld去加载执行,注意:写在load方法中,同时需要修改Mach-o文件的load commands(比如通过yololib修改)