CydiaSubstrate Hook 有两个函数 MSHookMessageEx 和 MSHookFunction
MSHookMessageEx 用来 hook Objective-C 函数
MSHookFunction 用来 hook C/C++ 函数
MSHookMessageEx 使用的是 method swizzle 方法
MSHookFunction 是通过函数地址进行的交换
官方实例:
void *(*oldConnect)(int, const sockaddr *, socklen_t);
void *newConnect(
int socket, const sockaddr *address, socklen_t length
) {
if (address->sa_family == AF_INET) {
sockaddr_in *address_in = address;
if (address_in->sin_port == htons(6667)) {
sockaddr_in copy = *address_in;
address_in->sin_port = htons(7001);
return oldConnect(socket, ©, length);
}
}
return oldConnect(socket, address, length);
}
MSHookFunction(&connect, &newConnect, &oldConnect);
函数的第一个参数 &connect 是调用 MSFindSymbol ,该函数会根据函数名查找函数地址。
所以第一个参数实际上就是函数地址,由此我们就可以通过传入函数地址,来 hook 任何 C/C++ 函数了。
实例:
void (*orig_testMethod)(void);
void hook_testMethod(void) {
// 调用原函数
}
unsigned long _sub_10016E640 = (_dyld_get_image_vmaddr_slide(0) + 0x100006678);
MSHookFunction((void *)(0x100006678+g_slide), (void *)hook_testMethod, (void **)&orig_testMethod);