Hook Objective-C 的方法

在 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);

应用场景:

大家一起想想^_^