IMG_5817.JPG

定义

  • MachO属于一种文件格式
    • 包含:可执行文件、静态库、动态库、dyld等库
    • 可执行文件
      • 通用二进制文件(fat):集合了多种架构
      • lipo命令
        • -thin 拆分架构
        • -create 合并架构
  • MachO结构
    • Header
      • 用于快速确定该文件的CPU类型,文件类型
    • Load Commands
      • 指示加载器如何设置并加载二进制数据
    • Data(详细数据)
      • 存放数据:代码段、数据段、字符串常量、类、方法等

代码注入

  • Framework注入、Dylib注入

    • Xcode自动打包进入APP包
    • MachO中Load Commands里面 需要有LC_LOAD_DYLIB字段
    • DYLD加载我们的动态库

      案例

  • 分析思路

  • 动态调试:界面入手
  • 静态分析:class-dump (头文件)OC的类、方法列表

    MethodSwizzle(RunTime) - 重点

  • exchange函数交换SEL与IMP的对应关系(书的目录)

    • 隐患:回不去!!!(没法调用原来的实现!)所以一般写在分类中,保证调回去
    • 解决方法
      • 添加方法列表 解决 - 过程比较复杂
      • replace函数替换IMP
      • getIMP和getImp配合,推荐——>logos语法,底层就是setImp和getImp
        • 临时存储旧getImp,设置新setImp,再调回旧getImp

Mach-O结构图

image.png


结构详解

  • dyld加载Mach-o文件,首先读取Mach-o header
  • 然后读取load commands(可以知道应用程序所有信息),包含了PAGEZERO、TEXT、DATA、LINKEDIT…
    • 加载其它库时,通过LC_LOAD_DYLIB (库名称) -> rePath找到地址,dyld就会去加载这个库
    • 因此注入代码可以插入自己的动态库,让dyld去加载执行,注意:写在load方法中,同时需要修改Mach-o文件的load commands(比如通过yololib修改)

未命名文件 (21).jpg