我正在尝试挂钩一个需要特定参数的方法。例如:我有一个类
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 个值,而且所有这些都不是我需要的。