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/

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