在 Windows 中主要有兩種鉤子:訊息鉤子與函數鉤子,有時在實現某些功能時必須用鉤子。
對函數掛鈎子主要是進行入口地址的替換,廣義的理解很多東西都是鉤子,比如中斷向量表。
可以對 C++ 中的靜態函數與虛函數掛鈎子,但是很難對普通函數掛鈎子,主要原因是C++沒有統一的 ABI標準。
但是可以對 Objective-C 掛鈎子,而且OC提供了一些運行時方法,讓掛鈎子相對簡單,比如:不需要用彙編來改地址。
下面以對 UIWebView 的 loadRequest: 掛鈎子作為例子,來說明如何在 Objective-C 中掛鈎子。
類名:UIWebView
方法名:loadRequest:
對應的C原型:
typedef void (*UIWebView_loadRequest__IMP)(UIWebView* self, SEL _cmd, NSURLRequest *request);
static UIWebView_loadRequest__IMP original_UIWebView_loadRequest;
void replaced_UIWebView_loadRequest(UIWebView* self, SEL _cmd, NSURLRequest *request) {
original_UIWebView_loadRequest(self, _cmd, request);
// TODO:
}
// 在某個點,例如:application:didFinishLaunchingWithOptions: 中加入如下代碼,就完成了掛鈎。
Method method = class_getInstanceMethod(NSClassFromString(@"UIWebView"), @selector(loadRequest:));
original_UIWebView_loadRequest = method_setImplementation(method, replaced_UIWebView_loadRequest);
應用情境:
大家一起想想^_^