OC類如果通過runtime被hook了,可以通過逆序遍歷方法列表的方式調用原方法。
那系統庫的C函數被fish hook了該怎么辦呢?
原理和OC類異曲同工,即通過系統函數dlopen()
獲取動態庫,以動態庫為參數通過系統函數dlsym()
即可獲取目標系統C函數的原始地址。
可以對比獲取到的函數地址與當前函數地址即可判斷該函數是否被hook了,也可以直接調用獲取到的函數。
#import "fishhook.h"
#include <dlfcn.h>
#include <mach-o/dyld.h>//原函數指針變量
static void (*ori_dyld_image_count)(void);//hook新函數
void hook_dyld_image_count() {NSLog(@"hook func called");return ori_dyld_image_count();
}// struct rebinding rebs[] = {{"_dyld_image_count", hook_dyld_image_count, (void *)&ori_dyld_image_count}};
// rebind_symbols(rebs, 1);void *handler = dlopen("/usr/lib/system/libdyld.dylib", RTLD_DEFAULT);
void *ori = dlsym(handler, "_dyld_image_count");if (ori == _dyld_image_count) {NSLog(@"is same");
} else {NSLog(@"is no same");
}// 通過如下方式打印所有動態庫路徑
uint32_t count = _dyld_image_count();
for (int i = 0; i < count; i++) {const char* name = _dyld_get_image_name(i);NSLog(@"%s", name);
}