iOS Hook之runtime

一、Hook概述

Hook(钩子) 其实就是改变程序执行流程的一种技术的统称!
Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
要实现钩子函数,有两个步骤:

  1. 利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景下使用)
  2. 动态代理(使用所有场景)

二、iOS中HOOK技术的几种方式

1、Method Swizzle
 利用OCRuntime特性,动态改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变的目的。主要用于OC方法。
注释OC 的函数是属于动态调用,在编译的时候是不能决定真正去调用那个函数的,只有在运行的时候才能决定去调用哪一个函数 ,在编译阶段,OC可以调用任何的函数,即使这个函数没有实现,只要声明过也就不会报错。

例如:button方法交换:分类中

+ (void)load {
    Method normal = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
    Method newMethod = class_getInstanceMethod(self, @selector(yy_sendAction:to:forEvent:));
    method_exchangeImplementations(normal, newMethod);
}

- (void)yy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    //做你想做的事情,例如防止重复点击,在这里需要动态给button添加一个时间间隔
    [self yy_sendAction:action to:target forEvent:event];
}

2、fishhook
它是Facebook提供的一个动态修改链接mach-O文件的工具。利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。Git:https://github.com/facebook/fishhook

3、Cydia Substrate
Cydia Substrate 原名为 Mobile Substrate ,它的主要作用是针对OC方法、C函数以及函数地址进行HOOK操作。当然它并不是仅仅针对iOS而设计的,安卓一样可以用。官方地址:http://www.cydiasubstrate.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章