当前位置: 首页 > 知识库问答 >
问题:

Xposed-如何钩住私有静态方法

宇文和昶
2023-03-14

暴露的问题:

我想修改一些静态字段android.os.构建,如android.os.构建。董事会,android.os.构建。设备,android.os.构建。显示。

构建中有3个私有静态方法(私有静态字符串getString(String属性)、私有静态字符串[]getStringList(String属性、字符串分隔符)、私有静态long getLong(String属性))。Java语言

然后我尝试挂接静态方法getString(String s)在android.os.构建。

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

    XposedBridge.log(loadPackageParam.packageName + " -> load ");

    Class build = XposedHelpers.findClass(Build.class.getName(), loadPackageParam.classLoader);

    XposedHelpers.findAndHookMethod(build, "getString", String.class, new XC_MethodHook() {
        @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
            XposedBridge.log("before ->" + param.args[0]);
            super.beforeHookedMethod(param);
        }

        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            XposedBridge.log("after ->" + param.args[0]);
            super.afterHookedMethod(param);
        }
    });}

当我调用android时,我尝试在before/after方法中打印第一个输入参数。操作系统。建筑模型但我错了,它并没有被触发。

如何在android中钩住这个私有静态方法。操作系统。建筑Java语言

private static String getString(String property) {
    return SystemProperties.get(property, UNKNOWN);}

共有2个答案

百里京
2023-03-14

我最近也做了一些你想做的事情。检查此项:https://github.com/pylerSM/XInstaller/blob/master/src/com/pyler/xinstaller/XInstaller.java#L1146

夹谷沛
2023-03-14
public void initZygote(StartupParam startupParam) throws Throwable {  

    Class clazz = XposedHelpers.findClass(android.os.Build.class.getName(), null);

    Method m = XposedHelpers.findMethodExact(clazz, "getString", String.class);

    m.setAccessible(true);

    XposedBridge.hookMethod(m, new XC_MethodHook() {
        @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
            log("call -> " + (String) param.args[0]);
            super.beforeHookedMethod(param);
        }
    });

    String id = (String) m.invoke(null, "ro.build.id");
    log("step 1 try invoke->" + id);
    log("step 2 Call Build.ID ->" + Build.ID);
}

步骤1可以提高beforeHookedMethod,但步骤2不能。

 类似资料:
  • 问题内容: 您如何看待使用 私有静态方法 ? 就个人而言,我更喜欢使用 静态 私有方法而不 是非 静态 方法,只要它不需要访问任何实例字段即可。 但是我听说这种做法违反了OOP原则。 编辑:我想从样式的角度来看,而不是性能。 问题答案: 一个方法本身本身并没有违反OOP,但是当类上有很多不需要(也不能*)访问实例字段的方法时,您就不会以OO方式进行编程,因为“对象”表示状态+一起定义的状态操作。如

  • 问题内容: 我正在尝试模拟私有静态方法。见下面的代码 这是我的测试代码 但是我运行的每个瓦片都会出现此异常 我想我在嘲弄东西时做错了什么。有什么想法我该如何解决? 问题答案: 为此,您可以使用和。 此外,您必须在测试类中指定PowerMock运行器,并准备要进行测试的类,如下所示: 希望对您有帮助。

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode

  • Java7&8在使用Mockito和PowerMockRunner时弹出新的错误,当涉及静态final变量时,java将抛出字节代码异常中的错误。这是由于现在更严格的字节码验证和模拟静态最终对象编辑字节码,以便成功模拟。 我有以下的类,我试图嘲弄: 我已经看到,您可以通过使用反射来解决这个问题,这里看到了如何使用JUnit、EasyMock或PowerMock模拟静态最终变量,这里看到了Power

  • 问题内容: 我想调用一个私有静态方法。我有名字 我听说可以使用Java反射机制来完成。我该怎么做? 编辑: 我在尝试调用该方法时遇到的一个问题是如何指定其参数的类型。我的方法收到一个参数,其类型为Map。因此,我不能这样做(在运行时,由于Java Type擦除,没有Map这样的东西)。是否有另一种方法来获得该方法? 问题答案: 假设您要调用MyClass.myMethod(int x);

  • 我目前在JUnit测试中遇到了障碍,需要一些帮助。所以我用静态方法得到了这个类,它将重构一些对象。为了简化起见,我举了一个小例子。这是我的工厂课程: 这是我的测试类: 基本上,我试图实现的是私有方法check String()应该被抑制(因此不会抛出异常),并且还需要验证方法check String()实际上是在方法factorObject()中调用的。 更新:抑制正常工作,代码如下: ... 但