Xposed - 如何勾取私有静态方法

3

Xposed问题:

我想修改android.os.Build中的一些静态字段,例如android.os.Build.BOARD、android.os.Build.DEVICE、android.os.Build.DISPLAY。

Build.java中有3个私有静态方法( private static String getString(String property), private static String[] getStringList(String property, String separator) , private static long getLong(String property) )。

然后我尝试钩住android.os.Build中的静态方法“getString(String s)”。

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.os.Build.Model时,在before/after方法中打印第一个输入参数。但是我错了,它没有被触发。

我该如何钩住android.os.Build.java中的这个私有静态方法?

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

你试过下面的方法了吗?public static Method findMethodExact(Class clazz, String methodName, Object... parameterTypes) { return findMethodExact(clazz, methodName, getParameterClasses(clazz.getClassLoader(), parameterTypes)); } - Prasad
@ Maddy_at_Work,谢谢你的帮助。我尝试了下面的代码,但还是不对。我是新手。 - Ray
2个回答

0
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);
}

第一步可以在beforeHookedMethod中触发,但第二步不能。

你能解决这个问题吗? - lightBullet

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接