zoukankan      html  css  js  c++  java
  • Hook ObjectiveC 的方法

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

    应用场景:

    大家一起想想^_^

  • 相关阅读:
    又见JavaWeb的中文乱码
    Java 中文字符串编码之GBK转UTF-8
    关于Java项目打包
    FreeSWITCH无法读取wav文件
    CentOS 7 最小化安装的网络配置
    虚拟机无法使用网卡桥接模式
    阿里云建站流程
    Spring MVC无法获取ajax POST的参数和值
    Mysql ERROR 1064 (42000)
    eclipse创建java类时自动添加注释
  • 原文地址:https://www.cnblogs.com/Proteas/p/2849697.html
Copyright © 2011-2022 走看看