CaptainHook 的使用

CaptainHook 的使用

在iOS逆向的时候发现一个很好用的库,他定义了一些hook常用的宏定义

  • CHDeclareClass 声明需要Hook的类
  • CHMethod作用是对应的方法Hook的实现
  • CHConstructor构造函数,在这里调用CHLoadLateClass加载Hook的方法和所在的类
  • CHLoadLateClass加载Hook类
  • CHHook注册Hook方法
  • CHOptimizedClassMethod 对类方法Hook
  • CHSuper 调用

使用方法

声明需要Hook的类

1
CHDeclareClass(HookClass)

Hook 对应的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 无参数的
// 第一个参数是 返回值类型
// 第二个参数是 需要Hook的类名
// 第三个参数是 需要hook的方法名
CHMethod0(NSString *, HookClass, hookMethod) {
return "需要的返回值"
}

// 有参数的
// 第一个参数是 返回值类型
// 第二个参数是 需要Hook的类名
// 第三个参数是 需要hook的方法名
// 第四个参数是 参数的类型
// 第五个参数是 参数的名称
CHMethod1(void, AWEAwemeModel, setVideo, AWEVideoModel *, arg1) {
BOOL isHookDownLoad = [UserDefaults boolForKey:HookDownLoad];
if (isHookDownLoad) {
arg1.downloadURL.originURLList = arg1.playURL.originURLList;
}
CHSuper1(AWEAwemeModel, setVideo, arg1);
}

// 对类方法Hook
// 第一个参数 optimization 不太清楚是什么, 应该是传self就好
// 第二个参数 返回值类型
// 第三个参数 需要Hook的类名
// 第四个参数 需要Hook的方法名
CHOptimizedClassMethod0(self, NSArray *, AWEDynamicWaterMarkExporter, watermarkLogoImageArray) {
BOOL isHookWaterMark = [UserDefaults boolForKey:HookWaterMark];
if (isHookWaterMark) {
return @[];
}
return CHSuper0(AWEDynamicWaterMarkExporter, watermarkLogoImageArray);
}

Hook

1
2
3
4
5
6
7
8
9
// 构造函数
CHConstructor {
// 加载注册过的类
CHLoadLateClass(AWEAwemeModel);
// 注册Hook方法
CHHook1(AWEAwemeModel, setPreventDownload);
// 注册Hook类方法
CHClassHook0(AWEDynamicWaterMarkExporter, watermarkLogoImageArray);
}

添加新属性

1
2
3
4
5
6
7
8
9
10
11
12
13
// 先添加一个属性
@interface HookClass
@property (nonatomic, copy) NSString *newProperty;
@end

// 添加新的属性
CHPropertyRetainNonatomic(HookClass, NSString*,
newProperty, setNewProperty);

CHConstructor{
CHHook0(HookClass, newProperty);
CHHook1(HookClass, setNewProperty);
}

基本这些就够用了,剩下的都差不多,自己尝试下就好。