swift赶脚者Ios@IONICiOS Developer

IOS中如何Hook消息

2016-06-27  本文已影响776人  480a52903ce5

前言:我们都知道在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:], --> ****操作我们想操作的事情**
上一篇 下一篇

猜你喜欢

热点阅读