「这是我参与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 tweak 和 fishhook 等方式来进行, 逆向是一门深学门, 要沉下心, 一定要静心, 不然很容易半途而废😭
大家不要学我, 如果有什么好的想法, 请告诉我, 谢谢