美文网首页iOS集合
CaptainHook Hook 代码

CaptainHook Hook 代码

作者: 加盐白咖啡 | 来源:发表于2019-06-22 15:14 被阅读0次
    // 无参数
    CHDeclareClass(WCActionSheet)
    CHOptimizedMethod0(self, NSArray *, WCActionSheet, buttonTitleList){
        NSArray *titles = CHSuper0(WCActionSheet, buttonTitleList);
        return titles;
    }
    
    CHConstructor{
        CHLoadLateClass(WCActionSheet);
        CHClassHook0(WCActionSheet, buttonTitleList);
    }
    
    // 一个参数
    CHDeclareClass(MMUIImageView);
    CHOptimizedMethod1(self, void, MMUIImageView, setImage, NSString *, imageurl){
        NSLog(@"setImage: %@", imageurl);
        CHSuper1(MMUIImageView, setImage, imageurl);
    }
    CHConstructor{    
        CHLoadLateClass(MMUIImageView);
        CHClassHook1(MMUIImageView, setImage);
    }
    

    例子:

    @interface Lefex : NSObject
    @property (nonatomic, copy) NSString *city;
    + (Lefex *)empty;
    - (void)updateNickName:(NSString *)nickName;
    - (void)updateNickName:(NSString *)nickName age:(int)age;
    - (void)requestNickNameForId:(NSString *)userId completion:(void(^)(NSString *))block;
    @end
    
    @synthesize city = _city;
    @implementation Lefex
    
    + (Lefex *)empty {
        NSLog(@"orgin - %@", NSStringFromSelector(_cmd));
        return [Lefex new];
    }
    
    - (void)updateNickName:(NSString *)nickName {
        NSLog(@"orgin - %@", NSStringFromSelector(_cmd));
    }
    
    - (void)updateNickName:(NSString *)nickName age:(int)age {
        NSLog(@"orgin - %@", NSStringFromSelector(_cmd));
    }
    
    - (void)requestNickNameForId:(NSString *)userId completion:(void(^)(NSString *))block {
        NSLog(@"orgin - %@", NSStringFromSelector(_cmd));
        if (block) {
            block(@"lefe_x");
        }
    }
    
    - (void)setCity:(NSString *)city {
        _city = city;
    }
    
    - (NSString *)city {
        return _city;
    }
    @end
    
    typedef void(^RequestBlock)(NSString *);
    
    // hook某个类时需要先声明
    CHDeclareClass(Lefex)
    
    // Hook 类方法
    CHOptimizedClassMethod0(self, Lefex *, Lefex, empty){
        Lefex *me = CHSuper0(Lefex, empty);
        NSLog(@"Hook empty");
        return me;
    }
    
    // Hook 一个参数的方法
    CHOptimizedMethod1(self, void, Lefex, updateNickName, NSString *, name) {
        CHSuper1(Lefex, updateNickName, name);
        NSLog(@"hook updateNickName");
    }
    
    // Hook属性,hook对应的get和set方法
    // hook set 方法
    CHOptimizedMethod1(self, void, Lefex, setCity, NSString *, city) {
        CHSuper1(Lefex, setCity, @"BeiJing");
        NSLog(@"hook setCity");
    }
    
    // hook get 方法
    CHOptimizedMethod0(self, void, Lefex, city) {
        NSLog(@"hook city");
        return CHSuper0(Lefex, city);
    }
    
    // Hook 两个参数的方法
    CHOptimizedMethod2(self, void, Lefex, updateNickName, NSString *, name, age, int, age) {
        CHSuper2(Lefex, updateNickName, name, age, age);
        NSLog(@"hook updateNickName: age");
    }
    
    // Hook 带有block的方法,需要知道 block 中的参数个数
    CHOptimizedMethod2(self, void, Lefex, requestNickNameForId, NSString *, userId, completion, RequestBlock, block) {
        RequestBlock nicknameBlock = ^(NSString *nickname) {
            NSLog(@"hook callback :%@", nickname);
            if (block) {
                block(nickname);
            }
        };
        
        CHSuper2(Lefex, requestNickNameForId, userId, completion, nicknameBlock);
        NSLog(@"hook requestNickNameForId: age");
    }
    
    // Hook 参数是二级指针的方法
    CHOptimizedMethod1(self, void, Lefex, queryLocation, NSString **, name) {
        CHSuper1(Lefex, queryLocation, name);
        NSLog(@"hook queryLocation: %@", *name);
    }
    
    CHConstructor {
        // 导入类才能够使用
        // linkable
        CHLoadClass(Lefex);
        // un linkable
    //    CHLoadLateClass(Lefex);
    
        CHClassHook1(Lefex, setCity);
        CHClassHook0(Lefex, city);
        CHClassHook0(Lefex, empty);
        CHClassHook1(Lefex, updateNickName);
        CHClassHook2(Lefex, updateNickName, age);
        CHClassHook2(Lefex, requestNickNameForId, completion);
        CHClassHook1(Lefex, queryLocation);
    }
    

    相关文章

      网友评论

        本文标题:CaptainHook Hook 代码

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