Fishhook的replaced是不是有缺陷啊?

用一个replaced来标记原本的函数
但是fishhook在hook懒加载符号的时候那个指针表还指着__stub_helper呢
最后你一使用懒加载符号的replaced它就又给你重绑定回来,当然fishhook里整个动态库的符号都被hook了一遍,dyld_stub_binder里面怎么绑的我也不清楚,但如果不是被重绑定回去的话那么肯定原本的系统函数也没调用到。
感觉这里应该拿到懒加载指针表里的指针后,先空转一下__stub_helper,让它绑定完了回来再拿replaced才比较合适啊,不过这样的话会先调用一次原函数,会不会出问题就不知道了……这部分可能要汇编写合适

这个就不好做, 首先不知道那个函数的参数个数, 类型, 随便传个进去还可能崩溃

可以研究下__stub_helper代码, 看它是怎么填充地址的, 手动填充一下

我觉得要先hook掉dyld_stub_binder,这个函数有两个参数(这种非懒加载的符号好像用的是压栈上的参数,不是一般的寄存器参数流程……),一个是懒加载指针表跳转到的 * replaced,就是在__stub_helper里面的那个位置, * ( * replaced+8)是它第一个参数,是要加载的符号在Lazy Binding Info里的信息,另一个参数是__stub_helper开头第一条指令存进x17那个地址,这个参数不管绑定哪个符号都是一样的……
dyld_stub_binder里面就干了两件事,一件事是调用_dyld_fast_stub_entry,这个应该是更内部绑定符号的函数,然后把它压栈两个参数传进去。另一件事就是__dyld_fast_stub_entry返回后跳转到它的返回值指针上去,所以那个_dyld_fast_stub_entry返回的应该就是绑定指针的地址了……
所以当fishhook可以搞一个全局变量,当它拿到* reserved的时候,把* ( * replaced+8)弄到全局变量里,然后Hook掉dyld_stub_binder以后它的代码在tweak里,能用这个全局变量了,逻辑变成还是调用__dyld_fast_stub_entry,但是要先拿它的第一个参数和全局变量做个比对,如果一样那最后就不跳转了,直接RET。这样的话* ( * replaced+8)弄进全局变量以后就可以立刻执行被hook的函数,先让它绑定而且不会跳转进去…绑定完再拿replaced
感觉还是麻烦的,fishhook不做情有可原吧……而且我还不知道__dyld_fast_stub_entry是只有那个动态库内可见还是可以由外部调用的……如果只能由dyld_stub_binder调用外部不可见就gg。

你管他调用约定是什么, 你实现了它的功能, 然后再调 fishhook 不就正常了