IOS中如何Hook消息

作者: 480a52903ce5 | 来源:发表于2016-06-27 15:46 被阅读776次

    前言:我们都知道在windows下可以通过API轻松的hook很多消息,IOS里面貌似还沒有现成的API,不过我们通过Objective-C运行时的一些东西,就可以实现这一个功能.
    So问题来了, 我们为什么要hook消息呢, 因为有些时候我们可能无法直接去继承一个类,却又像去截取这个类中的某些消息左耳一些处理, 然后在想对它进行一些我们自己想要的操作处理.
    具体过程我们look一下代码即可明白:
    ViewController中代码:

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        
        // 创建一个hook对象
        TestHook * hook = [[TestHook alloc]init];
        [self sendToMessage:@"ViewController的方法"];
    }
    
    - (void)sendToMessage:(NSString *)str{
        NSLog(@"%@",str);
    }
    

    TestHook.m中代码:

    + (void)load
    {
        // 获取到ViewController中sendEvent对应的method
        Method sendEvent = class_getInstanceMethod([ViewController class], @selector(sendToMessage:));
        Method sendEventMySelf = class_getInstanceMethod([self class], @selector(sendEventHooked:));
        
        // 然后用我们自己的函数的实现,替换目标函数对应的实现
        IMP sendEventMySelfImp = method_getImplementation(sendEventMySelf);
        class_replaceMethod([ViewController class], @selector(sendToMessage:), sendEventMySelfImp, method_getTypeEncoding(sendEvent));
    }
    
    /*
     * 截获到ViewController的sendEvent
     * 我们可以先处理完以后,再继续调用正常处理流程
     */
    
    - (void)sendEventHooked:(NSString *)str
    {
        // 操作我们想操作的事情
        NSLog(@"%s, --> %@",__func__,@"操作我们想操作的事情");
    }
    

    这样我们就把ViewController里面的方法实现部分给更改了,其控制台打印效果:

    **Hook[8843:291487] -[TestHook sendEventHooked:], --> ****操作我们想操作的事情**
    

    相关文章

      网友评论

      • fire_fire:你这是错的,都是在load方法里面swizzle method
        480a52903ce5:@春泥Fu 昨天看了南峰子大神的文章,看到了相关解释,多谢你的指点:pray:
        春泥Fu:@叫我干苦力的小码农 不能称之为错吧,如果只是class_replaceMethod的话没有错,只是大部分情况下都是swizzle method,然后在你替换的方法中再去调用原来的方法。
        480a52903ce5:@fire_fire 谢谢,你的指点,之后会改正的。:+1:
      • fb7d53e06f46:不错哦
        480a52903ce5:@Jamgle :ghost:
        480a52903ce5:@Jamgle 🗡️🌬️🐂👃

      本文标题:IOS中如何Hook消息

      本文链接:https://www.haomeiwen.com/subject/cdvzdttx.html