定义
HOOK,翻译过来就是“钩子”的意思,在IOS逆向中是改变程序运行流程的一种技术。通过HOOK可以让别人的程序执行自己写的代码。
虽然我们不会刻意想要篡改别人的代码。但是在开发的时候,我们可能想要改变一下系统本身的调用流程来达到自己的目的,或者,为了对恶意代码进行防护,我们都需要了解HOOK的原理~
IOS中实现HOOK的几种方式
Method Swizzle
概念
利用OC的Runtime特性,动态改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变的目的。主要用于OC方法的调换或者往系统方法注入代码。
理解
在OC中,SEL和IMP就像是糖纸和糖果一样🍬🍬🍬,每张糖纸都会包裹着自己的糖果,有芒果味,榴莲味,啊榴莲糖没有榴莲好吃。。。啊跑题了,删掉但是也会有有心人把糖果换掉,换成💍求个婚是叭~
SEL是方法编号就对应着糖纸
IMP是方法实现的真实地址,就像糖果,他们是一一对应的关系
方法真正的实现内容,就是这个糖果背后的生产线了,什么原料什么流程。
Method Swizle也就是相当于调皮的小朋友把两颗糖调换了,榴莲糖纸里面包着芒果味的,芒果糖纸包着榴莲味的。
在OC的runtime特性中,调用一个对象的方法就是给这个对象发送消息。然后以消息为依据,查找接收到消息的对象的方法列表,从方法列表中查找对应的SEL,这个SEL对应着一个IMP(但是一个IMP可以对应着多个SEL,通过这个IMP找到对应的方法调用)
在每个类中都有一个dispatch table,他本质就是将类中的SEL和IMP进行了关联绑定,我们Method Swizzle就是对dispatch table做了修改,从而改变了SEL对应的IMP。
fishbook
概念
他是Facebook提供的一个动态修改链接mach-O文件的工具,利用Mach-O文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。
Cydia Substrate
等我。。。。