文章目录
前言
iOS系统中一共有:C函数、Block、OC类方法
三种形式的方法调用。
Hook一个方法调用的目的一般是为了监控拦截或者统计一些系统的行为。
Hook的机制有很多种,通常良好的Hook方法都是以AOP的形式来实现的。
- 当我们想Hook一个OC类的某些具体的方法时可以通过Method Swizzling技术来实现、
- 当我们想Hook动态库中导出的某个C函数时可以通过修改导入函数地址表中的信息来实现(可以使用开源库fishhook来完成)、
- 当我们想Hook所有OC类的方法时则可以通过替换objc_msgSend系列函数来实现。
I hook 的方式
-
一个是通过修改内存中懒加载和非懒加载符号表指针所指向的地址来达到修改方法的目的,作用于主模块懒加载和非懒加载表的符号,在越狱和非越狱环境都可以使用,例如fishhook(符号表替换)。
-
一个是 cydia substrate:
通过inline hook的方式修改目标函数内存中的汇编指令,使其调转到自己的代码块,以达到修改程序的目的;主要是针对c,c++ 函数。同时支持针对oc的method swizzle(替换imp)