Xposed:使用特定参数挂钩方法

问题描述 投票:0回答:0

我正在尝试挂钩一个需要特定参数的方法。例如:我有一个类

com.example.someclass
,方法名是
getValue
。方法需要一个
String
。如果我通过
"Apple"
,它返回
"fruit"
,如果我通过
"Mellon"
它返回
"berry"
我希望它在我通过
"slices"
时返回
"Mellon"
。我试着用
findandhookmethod
做到这一点,但我不能在那里指定参数。

我试着在beforeHookedMethod中通过改变

param.args[0]
来改变它,但是它返回了一个错误。

问题也可能出在两个相互冲突的钩子上,因为我也有一个

hookallmethods
。 hookall 总是更改导致错误的参数。

这是我使用

beforeHookedMethod
的代码:

XposedHelpers.findAndHookMethod(Class.forName("android.os.SystemProperties"), "get", String.class, new XC_MethodHook() {

    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
        param.args[0] = "ro.product.brand";
    }

    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {}
});

hookAllMethods
:(这不起作用,因为
methodHookParam.args
不包含我实际需要的参数,既不是
get
,也不是
getInt
或'getBoolean`):

XposedBridge.hookAllMethods(Class.forName("android.os.SystemProperties"), "get", new XC_MethodReplacement() {


    @Override
    protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
        XposedBridge.log(methodHookParam.args.toString());
        String[] paramList = Arrays.copyOf(methodHookParam.args, methodHookParam.args.length, String[].class);
        String param = paramList[0];
        XposedBridge.log(paramList.toString());
        for (int i = 0; i < methodHookParam.args.length; i++) {
            try {
                XposedBridge.log("1:  " + paramList[i]);
                
            } catch (NullPointerException ex) {
                XposedBridge.log("Error: "+ ex);
            }
        }

        switch (param) {
            case "ro.build.id":
                return "JZO54K";
            case "ro.build.display.id":
                return "JZO54K.I739KEAMF1";
            case "ro.build.version.incremental":
                return "I739KEAMF1";
            case "ro.build.version.sdk":
                return 31;
            case "ro.build.version.codename":
                return "REL";
            case "ro.build.version.release":
                return "12";
            case "ro.build.type":
                return "user";
            case "ro.build.user":
                return "se.infra";
            case "ro.build.host":
                return "S0210-08";
            case "ro.build.tags":
                return "release-keys";
            case "ro.product.model":
                return "SCH-I739";
            case "ro.product.brand":
                return "samsung";
            case "ro.product.name":
                return "kyleplusctc";
            case "ro.product.device":
                return "kyleplusctc";
            case "ro.product.board":
                return "MSM8625";
            case "ro.product.cpu.abi":
                return "armeabi-v7a";
            case "ro.product.cpu.abi2":
                return "armeabi";
            case "ro.product_ship":
                return "true";
            case "ro.product.manufacturer":
                return "samsung";
            case "ro.product.locale.language":
                return "zh";
            case "ro.product.locale.region":
                return "CN";
            case "ro.board.platform":
                return "msm7627a";
            case "ro.build.product":
                return "kyleplusctc";
            case "ro.build.description":
                return "kyleplusctc-user 4.1.2 JZO54K I739KEAMF1 release-keys";
            case "ro.build.fingerprint":
                return "samsung/kyleplusctc/kyleplusctc:4.1.2/JZO54K/I739KEAMF1:user/release-keys";
            case "ro.build.characteristics":
                return "china_wlan,china_cdma";
            case "ro.build.PDA":
                return "I739KEAMF1";
            case "ro.build.hidden_ver":
                return "I739KEAMF1";
            case "ro.build.changelist":
                return 1283033;
            case "ro.opengles.version":
                return 131072;
            case "ro.use_data_netmgrd":
                return true;
            case "ro.bluetooth.request.master":
                return true;
            case "ro.qualcomm.bluetooth.ftp":
                return true;
            case "ro.qualcomm.bluetooth.sap":
                return true;
            case "ro.bluetooth.remote.autoconnect":
                return true;
            case "ro.config.ehrpd":
                return true;
            case "ro.qualcomm.cabl":
                return 1;
            case "ro.fm.analogpath.supported":
                return true;
            case "ro.fm.transmitter":
                return false;
            case "ro.fm.mulinst.recording.support":
                return false;
            case "ro.emmc.sdcard.partition":
                return 18;
            case "ro.screen.layout":
                return "normal";
            case "ro.staticwallpaper.pixelformat":
                return "RGB_565";
            case "ro.max.fling_velocity":
                return 4000;
            case "ro.telephony.default_network":
                return 10;
            case "ro.cdma.ecmexittimer":
                return 0;
            case "ro.config.combined_signal":
                return true;
            case "ro.kernel.qemu":
                return 0;
            case "ro.carrier":
                return "unknown";
            case "ro.com.google.clientidbase":
                return "android-samsung";
            case "ro.ril.hsxpa":
                return 1;
            case "ro.ril.gprsclass":
                return 10;
            case "ro.adb.qemud":
                return 1;
            case "ro.setupwizard.mode":
                return "OPTIONAL";
            case "ro.debuggable":
                return 0;
            case "ro.secure":
                return 1;
        }
        return "";
    }
});

上下文:我需要更改设备的信息,如品牌和指纹,android.os.SystemProperties 有不同的方法,如 get、getInt 或 getBoolean,但实际值,比如说品牌,是在使用参数调用“get”后检索的ro.product.brand”像这样(返回“类:谷歌”):

Class<?> newClass = Class.forName("android.os.SystemProperties");
XposedBridge.log("Class:  " + Arrays.toString(newClass.getMethods()));
Method method = newClass.getDeclaredMethod("get", String.class);
XposedBridge.log("Class:  " + method.invoke(null, "ro.product.brand").toString());

错误是:

意外崩溃:java.lang.NumberFormatException:对于输入字符串:“samsung”

问题的出现似乎是因为在将其更改为“ro.product.brand”之前使用的参数值需要返回整数。因此,当我不断地将它更改为“ro.product.brand”时(我猜它经常发生但不是一次,因为我为他的所有参数而不是一个参数挂钩了方法),在某些时候(在我的情况下是第 3时间)我会得到上面提到的错误。

正如您在

hookAllMethods
中看到的,我只是从
param.args
中获取值,然后检查它是否是我需要的。问题是只有 6 个值,而且所有这些都不是我需要的。

java hook xposed xposed-framework
© www.soinside.com 2019 - 2024. All rights reserved.