什么是Hook?
Hook(钩子),是改变程序运行流程的一种技术。
IOS中Hook的几种方式
- method Swizzle(oc函数)
- fishhook(C函数)
- Cydia Substrate(OC,C,函数地址)
FishHook学习笔记
使用到的技术
- 利用dyld相关接口,我们可以注册image装载的监听方法:
extern void _dyld_register_func_for_add_image(void (func)(const struct mach_header mh, intptr_t vmaddr_slide)); - 调用_dyld_register_func_for_add_image注册监听方法后,当前已经装载的image(动态库等)会立刻触发回调,
之后的image会在装载的时候触发回调。 - dyld在装载的时候,会对符号进行bind,而fishhook则会在回调函数中进行rebind。
hook过程
- 1.先找到SEG_LINKEDIT加载命令
- 2.获取它加载后在VM中的linkedit_base(_dyld_get_image_vmaddr_slide()//获取内存镜像模块基地址)
- 3.通过基地址找到三个表基地址、间接符号表、符号表、字符串表
- 4.找到要hook中函数符号
- 5.先保存,再修改为指向我们自己的符号
FishHook原理
- 懒加载
- 非懒加载 ==>通过查找表 替换符号对应的地址
遍历该查找表查找符号,替换地址