IMG_5844.JPG分类

  • Method Swizzle
    • 利用OC的Runtime特性,动态改变SEL和IMP的对应关系,达到OC方法调用流程改变的目的。主要用于OC方法。
  • fishHook
    • Facebook提供的一个动态修改链接mach-O文件的工具,利用machO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。
  • Cydia Substrate

    • 原名Mobile Substrate,它的主要作用是针对OC、C函数以及函数地址进行HOOK操作,iOS和Android都适用。
    • logos语法
    • MobileLoader、Safe mode等,是一个完善的框架。

      fishHook

  • 自定义的c函数,hook不了,系统的C函数可以hook

  • PIC技术(位置无关代码):LLVM编译时确定桩,在加载进内存时,dyld加载共享缓存库,确定了函数地址高速MachO
    • MachO中 Text段 -> 只读/可执行,Data段 -> 可读/可写
    • 因此在Data段放了 符号 - 占位符(8字节 — 0x0000000)
    • dyld将此符号进行修改的过程叫符号绑定!!!
    • 外部的C函数调用,是通过符号找地址

未命名文件 (30).jpg

  • 符号表:变量名、函数名、方法名 -> symbols包含了所有的符号
    • 内部符号
    • 外部符号 - 间接符号表
    • 全局符号 —- 动态库 第三方库
    • 本地符号 —- 打包去符号,去的是本地符号
  • Indirect Symbols 间接符号表 -> 用来保存外部符号的,如上述的NSLog符号
  • bl -> 桩(代码,在text段,去符号表里面的地址执行) -> 符号表

总结:

  • 程序执行,先在Non-lazy Symbol Pointers非懒加载符号表中绑定dyld_stub_binder, 通过 dyld_stub_binder
  • 符号表中保存的是地址,取出执行,需要代码去处理,代码就保存在桩里
  • 符号绑定的过程
    • 外部函数调用是执行桩里面的代码,每个外部函数对一个桩,在Text段 stub
      • 通过懒加载符号表里面的地址去执行
        • 第一次执行的是找binder代码
        • 第二次执行的保存的地址
    • 懒加载符号表中默认保存的是寻找binder的代码
      • binder函数在非懒加载符号表中,程序运行,就绑定好了
  • 延伸 -> 动态库还保存了外部符号,静态库则没有外部符号,体积更小

未命名文件 (31).jpg