objc runtime 中有两个同名的 Class,直接 %hook class_name 可能会 mismatch。
现在的思路是在一些系统接口中找到 obj,然后通过 [obj class] 定位到使用的 class 再 hook。
有其他更直接的方式解决该问题吗?
这种同名的不会报错吗
不会的呢。Objc runtime 可以重复加载同名类,后者会覆盖掉已有的。
获取调用栈,判断是谁调用的。
还可以参考下面代码判断调用来源:
- (BOOL)isCallFromXXX{
NSArray *address = [NSThread callStackReturnAddresses];
Dl_info info = {0};
if(dladdr((void *)[address[2] longLongValue], &info) == 0){
return NO;
}
NSString *path = [NSString stringWithUTF8String:info.dli_fname];
if ([path hasPrefix:NSBundle.mainBundle.bundlePath]) {
// 二进制来自 ipa 包内
if ([path.lastPathComponent isEqualToString:@"xxx.dylib"]) {
// 二进制是插件本身
return YES;
} else {
// 二进制是主程序
return NO;
}
} else {
// 二进制是系统或者越狱插件
return NO;
}
}