CaptainHook

1,401 阅读2分钟

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

CaptainHook 使用方法

使用到的类和方法, 都需要再对应的头文件, 先进行声明.

hook指定类
CHDeclareClass(<#name#>)

hook指定类方法
CHOptimizedClassMethod0(<#optimization#>, <#return_type#>, <#class_type#>, <#name#>)

hook指定对象方法
CHOptimizedMethod0(<#optimization#>, <#return_type#>, <#class_type#>, <#name#>)

对指定的类新增一个属性
CHPropertyRetainNonatomic(<#class#>, <#type#>, <#getter#>, <#setter#>)

对指定的示例对象新增 对象方法
CHDeclareMethod0(<#return_type#>, <#class_type#>, <#name#>)

对指定的示例对象新增 类方法
CHDeclareClassMethod0(<#return_type#>, <#class_type#>, <#name#>)

在构造函数中 hook指定类

CHConstructor{
    CHLoadLateClass(<#name#>);
}

在构造函数中 hook指方法

CHConstructor{
    CHClassHook0(<#class#>, <#name#>);
}

在构造函数中 添加属性, 但是需要注意的是要写对应的set get方法

CHConstructor{
    CHClassHook0(<#class#>, <#name#>);
}

举个栗子

.h 我们先用于原生写一个类, 来用于测试

@interface person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assgin) int age;
+ (person *)people;
- (void)changeName:(NSString *)name;
- (void)changeName:(NSString *)name age:(int)age;
- (void)getNameForId:(NSString *)userId completion:(void(^)(NSString *))block;
@end

.m

@synthesize name = _name;
@synthesize age = _age;
@implementation person
+ (person *)people {
    return [person new];
}
- (void)changeName:(NSString *)name {
    _name = name;
}
- (void)updateNickName:(NSString *)nickName age:(int)age {
    _name = name;
    _age = age;
}
- (void)getNameForId:(NSString *)userId completion:(void(^)(NSString *))block {
    if (block) {
        block(_name);
    }
}
- (void)setName:(NSString *)name {
    _name = name;
}
- (NSString *)name {
    return _name;
}
@end

上诉是一个很简单的类, 下面咱们来hook这个类来试试

就像咱们开头所说的, hook的时候必须先声明
CHDeclareClass(person)

hook 类方法 people

CHOptimizedClassMethod0(self, person *, person, people){
    person *aa = CHSuper0(person, people);
    return aa;
}

hook 对象方法, 只有一个参数

CHOptimizedMethod1(self, void, person, changeName, NSString *, name) {
    CHSuper1(person, changeName, name);
}

hook 对象方法, 有多个参数

CHOptimizedMethod2(self, void, person, changeName, NSString *, name, int, age) {
    CHSuper2(person, changeName, name, age);
}

hook 属性的set 和 get 方法

CHOptimizedMethod1(self, void, person, setName, NSString *, name) {
    CHSuper1(person, setName, @"小明");
}
CHOptimizedMethod0(self, void, person, name) {
    return CHSuper0(person, name);
}

hook 有block

// 首先声明一个block类型
typedef void(^nameBlock)(NSString *);

CHOptimizedMethod2(self, void, person, getNameForId, NSString *, userId, completion, nameBlock, block) {
    nameBlock hookBlock = ^(NSString *name) {
        if (block) {
            block(name);
        }
    };
    
    CHSuper2(person, getNameForId, userId, completion, hookBlock);
}

结语

相信经过上述的了解, 大家应该对CaptainHook有一定的了解, 在逆向过程中综合和各种方式来使用, 这样才能达到想要的效果, 也不一定只能通过CaptainHook, 也可以通过 logos tweakfishhook 等方式来进行, 逆向是一门深学门, 要沉下心, 一定要静心, 不然很容易半途而废😭

大家不要学我, 如果有什么好的想法, 请告诉我, 谢谢