请教个问题,返回值为 CFArrayRef 方法非越狱怎么hook?

最近使用脉脉,发现不让访问通讯录不能使用。然后就写了个 通讯录过滤的功能 。

在越狱手机上是可以用MSHookFunction 通过hook CFArrayRef ABAddressBookCopyArrayOfAllPeople(ABAddressBookRef addressBook)方法实现。

但是在非越狱手机是有问题的。然后尝试 fishhook,提示返回值有问题。由于基础知识不牢固,不知道怎么改。

附上源码地址 MaiMaiPlugin

返回值有问题有具体报错吗

方法声明
static CFArrayRef (*original_ABAddressBookCopyArrayOfAllPeople)(ABAddressBookRef addressBookRef);
static CFArrayRef hooked_ABAddressBookCopyArrayOfAllPeople(ABAddressBookRef addressBookRef){}

fishhook

rebind_symbols((struct rebinding[1]){{"_ABAddressBookCopyArrayOfAllPeople", hooked_ABAddressBookCopyArrayOfAllPeople, (void*)&original_ABAddressBookCopyArrayOfAllPeople}},1);

报错信息
Cannot initialize a member subobject of type ‘void *’ with an lvalue of type ‘CFArrayRef (ABAddressBookRef)’ (aka ‘const __CFArray *(const void *)’)

Cannot initialize a member subobject of type ‘void **’ with an rvalue of type ‘void *’

感觉是类型不对,不知道怎么改。指针这块 基础不是很好。

函数名没有下划线吧

越狱情况下 使用MSFindSymbol 需要查找带下划线的。现在是用fishhook 这样返回值和参数的方法不能编译。

你试一试不带下划线,MobileSubstrate 和 fishhook 的原理完全不一样。

试了,编译不过去。我看到多实例都是 hook 返回值 int 或者 没有返回值的方法。没找到 返回值是 CFArrayRef 相关的例子。

看错了。。。。你这是编译错误, rebind 那行写错了

该怎么写呢? 这个 实在是不太懂啊。

fishhook 文档看看咯

改成
rebind_symbols((struct rebinding[1]){{“_ABAddressBookCopyArrayOfAllPeople”, (void*)hooked_ABAddressBookCopyArrayOfAllPeople, (void**)&original_ABAddressBookCopyArrayOfAllPeople}},1);
就正常了。。

这就是c和cpp的编译区别了。。