Xposed-如何挂接私有静态方法 [英] Xposed - How to hook the private static method

查看:933
本文介绍了Xposed-如何挂接私有静态方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

提出的问题:

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

I want to modify some static field in android.os.Build, such as android.os.Build.BOARD, android.os.Build.DEVICE, android.os.Build.DISPLAY.

共有3种私有静态方法( 私有静态String getString(String property), 私有静态String [] getStringList(String property,字符串分隔符), 私有静态长getLong(String property) ).

There are 3 private static methods ( private static String getString(String property), private static String[] getStringList(String property, String separator) , private static long getLong(String property) ) in Build.java.

然后我尝试在android.os.Build中钩住静态方法'getString(String s)'.

Then I tried to hook the static method 'getString(String s)' in android.os.Build .

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方法中打印第一个输入参数.但是我错了,它还没有被触发.

I try to print the first input argument in the before/after method, when I call android.os.Build.Model. But I'm wrong, it has not been triggered.

如何挂接此私有静态方法 在android.os.Build.java

How can I hook this private static method in android.os.Build.java

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

推荐答案

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不能.

step 1 can raise beforeHookedMethod, but step 2 can not.

这篇关于Xposed-如何挂接私有静态方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆