-
Notifications
You must be signed in to change notification settings - Fork 105
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BUG] HookParam call timing problem #47
Comments
试试 |
谢谢大佬的回复,我试了下换成 Log.d 之后也还是一样的问题,但是出现 false 的几率变小了很多,然后我进一步测试,发现把 |
补充一下,发现一个临时的解决方案,在最前面加上 |
因为 Log 会导致延迟,这个时候宿主的代码和你执行的时间不是同步的,执行的时间就会比你靠前,出现这种情况大概是正常的,这不是 API 的问题 因为 |
这大概不是 API 的管辖范围内,所以关闭了,不能认为是 bug |
感觉有点反直觉诶,为什么在同一次hook中args会发生变化呢,那这样的话感觉是一个很严重的问题呀,理论上每一次hook执行不应该是相互隔离的嘛。
这里没太懂,beforehook不是总在originmethod之前运行,并且beforehook运行完后origin method才会执行嘛 beforehook(param) 我以为的大概是这个流程,那按理说每一次运行到beforehook时,param.args就应该不会发生改变了才对。现在的情况看起来是不同的method调用之间的param.args之间会互相混在一起? 所以其实对于每一次method调用,共享的都是一个param?所以如果method调用的比较快就会导致后一次调用的param把前一次的覆盖掉? |
你用原生 Xposed API 试一下,如果有这个问题你再告诉我 |
大佬我试了下原生Xposed,不会出现这个问题,代码如下 package com.example.test_yuki_bug;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class MainHook implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.wibo.bigbang.ocr")) return;
hook(lpparam);
}
private void hook(XC_LoadPackage.LoadPackageParam lpparam) {
XposedHelpers.findAndHookMethod("okhttp3.Request$Builder",
lpparam.classLoader, "addHeader", String.class, String.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws InterruptedException {
String a1 = (String) param.args[0];
Thread.sleep(500);
String a2 = (String) param.args[0];
Log.d("checkEqual", a1.equals(a2) + " a1: " + a1 + " a2: " + a2);
}
});
}
} |
那你把复现 apk 和 demo 都发上来,我有空试试 |
在注解声明 如果依然不行,参考这个问题 #23,你可以切到这个版本试试可不可以修复,分别测试 1.1.4 和 1.1.5 版本 告诉我每个测试准确的结果。 |
已测试,问题存在,且问题症状无明显区别(false出现几率相同)
已测试,都存在问题,且问题症状无明显区别(false出现几率相同)
已测试,不存在问题,始终为 true 模块demo (Yuki):yuki_bug_test.zip |
这次我也无法得知具体是什么原因了,看起来代理会破坏其原始结果,那么就先使用变量把它存起来吧,你大概也不会有短时间内重复调用它的硬性需求。 除了 args,你测试一下其它值会不会改变,比如 result hasThrowable member 等这些 param 里的对象,可以点进去看一下。 另外 args 调用方法由 args().first().string() 换成 args[0] 试试 |
API 仅代理了 before 事件,replace 事件是 API 自己对 before 的一个封装,会设置 result = 目标替换值,只有这个事件的行为不同 ↑ 不知道是否和这个有关 |
我突然想到,现在只有一个控制变量不同了 你在外面套上这个 withProcess(mainProcessName) { |
大佬我发现bug在哪了,beforeHookParam 的定义位置好像放错了,导致每次 hookcallback 调用共享了同一个 beforeHookParam 实例。 当被hook的method调用的比较慢时,放在外面没有问题,但是如果被hook的method调用的比较快,就会出现后一次调用的 YukiHookCallback.Param 覆盖掉 beforeHookParam.params 属性的情况。所以问题 #23 也可能是这个原因导致的 因此,把 beforeHookParam 放在 YukiMemberHook.beforeHookedMember 里面就没有问题了 |
|
复现步骤:
安装宿主app:布丁扫描,启动宿主APP
观察Logcat,发现有好几次输出了false,按理来说应该始终是true才对
把a1后面的
loggerD("checkEqual", "", LoggerType.LOGD)
删掉后,程序运行正常(始终输出trueThe text was updated successfully, but these errors were encountered: