在 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);
应用场景:
大家一起想想^_^