多个插件hook同一个函数

如果多个tweak hook了同一个函数,真正生效的是哪个,会不会产生冲突?望大佬们指教!

ps:我自己尝试两个插件hook同一个函数,只会有一个生效

逻辑上会产生一个hook链,理论上都有效吧

2 个赞

那这种逻辑上的hook链的顺序是什么,我担心的是每个hook的结果不一样,这样会导致最终结果不确定

oc的不影响。
cydia的c hook 应该只生效第一个,记得实现好像是判断之前hook过就返回了。

那oc的hook顺序呢

hook的先后顺序

后HOOK的方法先生效,先HOOK的方法后生效

怎么去看hook的先后顺序啊

我的意思是hook的先后顺便是由什么决定的 我安装两个插件 哪个先哪个后

  1. 顺便写两个自定义的类去hook OC 的方法
  2. 打两个断点
  3. 执行该方法

按插件的加载顺序,mach-o的Load Commands

你这样说我就明白了,感谢

我又看了下,确实是后加载的先执行,但是始终只hook了一次,先加载的那个插件没有hook

想想也不可能只hook一次
如果是这样的话,那么多插件都hook SpringBoard的didFinishLaunchingWithOptions,照你的说法,我稍微多装几个插件,就会发现之前的不起作用了?哪有这种道理

1 个赞

我自己测试确实确实是的,可能我弄的哪里有问题吧

其实很简单.就看你hook的时候有没有调用原函数 %orig; 如果没有 的话当然只会执行一个

3 个赞

怎么说呢? 我发现我们项目有两个地方 hook,但是感觉只会调用一次 hook 的方法 怎么解决呢
//先尝试給源方法添加实现,这里是为了避免源方法没有实现的情况
BOOL didAddMethod = class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {//添加成功:将源方法的实现替换到交换方法的实现
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
}
else {
//添加失败:说明源方法已经有实现,直接将两个方法的实现交换即可
method_exchangeImplementations(originalMethod, swizzledMethod);
}

你好 你这个问题解决了吗?怎么解决呢?我这边也碰到了多个地方 hook 同一个方法,只有一个方法生效