【问题标题】:Hooking method with ArrayList<MyObject> parameter使用 ArrayList<MyObject> 参数的挂钩方法
【发布时间】:2020-06-13 18:37:34
【问题描述】:

我有一个类 MyObject 和一个主要活动实现方法 test(ArrayList&lt;MyObject&gt; x) 的应用程序

    public class MyObject {

    private String x;

    MyObject(String x) {
        this.x = x;
    }

    public String getX() {
        return x;
    }
}

现在我需要将方法test 与xposed 挂钩以获取参数x。如何访问和遍历 ArrayList 并调用 getX 方法?我的第一种方法是将其作为findAndHookMethod 方法的参数传递:

final Class<?> myObject = XposedHelpers.findClass(
    "com.xposed.packagehook.MyObject", lpparam.classLoader);`

但我不知道如何将其包装到 ArrayList 中。

【问题讨论】:

    标签: java android xposed


    【解决方案1】:

    在开发钩子时,使用应用程序源代码作为基础并不是一个好主意。建议使用编译好的APK文件,使用apktool之类的工具进行反编译。原因是编译后的代码有时看起来与您期望的有点不同:

    方法参数定义ArrayList&lt;MyObject&gt;由两部分组成:

    1. 对象类型ArrayList
    2. 一个(泛型)类型参数MyObject

    泛型不是原始 Java 定义的一部分,当这个概念后来被添加时,它仅限于编译器。因此泛型类型参数仅在编译器时存在于方法签名中。在 app dex 字节码和 rune-time 中,您只会以这种方式看到方法测试:

    void test(ArrayList x)
    

    或在 Smali 代码中与 apktool 输出的相同:

    method public test(Ljava/util/ArrayList;)V
    

    一些反编译器也可能显示泛型类型参数,但该信息来自一个注释,该注释不是您挂钩方法所需的方法签名的一部分。

    因此,如果您想挂钩此方法,MyObject 完全无关紧要。只需挂钩具有java.util.ArrayList 参数的测试方法即可。

    【讨论】:

    • 好的。所以我可以访问 ArrayList。但是我如何调用 getX 方法,因为我的 xposed 应用程序中没有 MyObject 类?
    • @Mow 因为它是 Java,您仍然可以通过反射访问每个方法。可以找到一个非常相似的示例 here (especially the last lines of the code),它在应用程序定义的 Person 对象上调用方法 setParents
    • 我已经用XposedHelpers.callMethod方法完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多