一、Hook概述
Hook(鉤子) 其實就是改變程序執行流程的一種技術的統稱!
Hook 技術又叫做鉤子函數,在系統沒有調用該函數之前,鉤子程序就先捕獲該消息,鉤子函數先得到控制權,這時鉤子函數既可以加工處理(改變)該函數的執行行爲,還可以強制結束消息的傳遞。簡單來說,就是把系統的程序拉出來變成我們自己執行代碼片段。
要實現鉤子函數,有兩個步驟:
- 利用系統內部提供的接口,通過實現該接口,然後注入進系統(特定場景下使用)
- 動態代理(使用所有場景)
二、iOS中HOOK技術的幾種方式
1、Method Swizzle
利用OC的Runtime特性,動態改變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/