Code Monkey home page Code Monkey logo

Comments (20)

fankes avatar fankes commented on May 27, 2024 1

我差点忘了,这个类一直有历史遗留问题,这个位置是故意放外面的,当时这么改的原因就是为了确定唯一的 HookParam 对象,为了使用 extraData,但是没想到遇到了你这个问题。

还有就是因为 HookParam 重复创建会导致 hook ClassLoader 卡死 #14,所以后面就改成这样了,没事,这些东西大部分是我在 coding 很烂的时候写的,新的 API 将会重写这个类 #33,后面先会发小版本 1.2.0 修复一下这个错误和其它问题。

from yukihookapi.

fankes avatar fankes commented on May 27, 2024 1

1.2.0 版本已发布,该问题已被修复。

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

试试 XposedBridge.log 以及 Log.d

from yukihookapi.

cesaryuan avatar cesaryuan commented on May 27, 2024

试试 XposedBridge.log 以及 Log.d

谢谢大佬的回复,我试了下换成 Log.d 之后也还是一样的问题,但是出现 false 的几率变小了很多,然后我进一步测试,发现把 loggerD 换成 Thread.sleep(500) 后有一样的效果,出现 false 的几率特别大;但是换成 Thread.sleep(1) 之后就小了很多(还是会有 false)

from yukihookapi.

cesaryuan avatar cesaryuan commented on May 27, 2024

补充一下,发现一个临时的解决方案,在最前面加上 val args = args

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

因为 Log 会导致延迟,这个时候宿主的代码和你执行的时间不是同步的,执行的时间就会比你靠前,出现这种情况大概是正常的,这不是 API 的问题

因为 loggerD 会同时调用两个 Logd 耗时会更长

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

这大概不是 API 的管辖范围内,所以关闭了,不能认为是 bug

from yukihookapi.

cesaryuan avatar cesaryuan commented on May 27, 2024

感觉有点反直觉诶,为什么在同一次hook中args会发生变化呢,那这样的话感觉是一个很严重的问题呀,理论上每一次hook执行不应该是相互隔离的嘛。

执行的时间就会比你靠前

这里没太懂,beforehook不是总在originmethod之前运行,并且beforehook运行完后origin method才会执行嘛

beforehook(param)
orginMethod(param.args)
afterhook(param)

我以为的大概是这个流程,那按理说每一次运行到beforehook时,param.args就应该不会发生改变了才对。现在的情况看起来是不同的method调用之间的param.args之间会互相混在一起?

所以其实对于每一次method调用,共享的都是一个param?所以如果method调用的比较快就会导致后一次调用的param把前一次的覆盖掉?

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

你用原生 Xposed API 试一下,如果有这个问题你再告诉我

from yukihookapi.

cesaryuan avatar cesaryuan commented on May 27, 2024

你用原生 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);
                    } 
                });
    }
}

image

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

那你把复现 apk 和 demo 都发上来,我有空试试

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

在注解声明 isUsingResourcesHook = false 再试试,无论如何先试试这个

如果依然不行,参考这个问题 #23,你可以切到这个版本试试可不可以修复,分别测试 1.1.4 和 1.1.5 版本

告诉我每个测试准确的结果。

from yukihookapi.

cesaryuan avatar cesaryuan commented on May 27, 2024

分别测试 1.1.4 和 1.1.5 版本

image
在这里修改就可以嘛

from yukihookapi.

cesaryuan avatar cesaryuan commented on May 27, 2024

在注解声明 isUsingResourcesHook = false 再试试

已测试,问题存在,且问题症状无明显区别(false出现几率相同)

分别测试 1.1.4 和 1.1.5 版本

已测试,都存在问题,且问题症状无明显区别(false出现几率相同)

你用原生 Xposed API 试一下

已测试,不存在问题,始终为 true

模块demo (Yuki):yuki_bug_test.zip
模块demo (原Xposed):同上(放在一个单独的Module里了)
宿主APK:(安装后需点击同意用户协议后运行到登录界面,但无需登录即可复现bug。如果出现闪退,禁用模块后运行一次宿主APP然后再启用模块即可)

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

这次我也无法得知具体是什么原因了,看起来代理会破坏其原始结果,那么就先使用变量把它存起来吧,你大概也不会有短时间内重复调用它的硬性需求。

除了 args,你测试一下其它值会不会改变,比如 result hasThrowable member 等这些 param 里的对象,可以点进去看一下。

另外 args 调用方法由 args().first().string()

换成 args[0] 试试

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

API 仅代理了 before 事件,replace 事件是 API 自己对 before 的一个封装,会设置 result = 目标替换值,只有这个事件的行为不同

↑ 不知道是否和这个有关

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

我突然想到,现在只有一个控制变量不同了

你在外面套上这个 withProcess(mainProcessName) {
}

from yukihookapi.

cesaryuan avatar cesaryuan commented on May 27, 2024

大佬我发现bug在哪了,beforeHookParam 的定义位置好像放错了,导致每次 hookcallback 调用共享了同一个 beforeHookParam 实例。

当被hook的method调用的比较慢时,放在外面没有问题,但是如果被hook的method调用的比较快,就会出现后一次调用的 YukiHookCallback.Param 覆盖掉 beforeHookParam.params 属性的情况。所以问题 #23 也可能是这个原因导致的

因此,把 beforeHookParam 放在 YukiMemberHook.beforeHookedMember 里面就没有问题了

image

from yukihookapi.

fankes avatar fankes commented on May 27, 2024

很奇怪,我什么都没改的情况下,用你给的 demo 在我这复现不了问题

image

from yukihookapi.

cesaryuan avatar cesaryuan commented on May 27, 2024

很奇怪,我什么都没改的情况下,用你给的 demo 在我这复现不了问题

image

大佬宿主APP运行到哪个页面了。

如何不用这个宿主,也可以自己写个宿主APP开多线程并发调用被hook函数

from yukihookapi.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.