|
|
@@ -16,6 +16,7 @@ import org.json.JSONObject;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
+import java.lang.reflect.Method;
|
|
|
import java.util.List;
|
|
|
import java.util.Optional;
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
@@ -45,7 +46,8 @@ public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit
|
|
|
@SuppressLint("UnspecifiedRegisterReceiverFlag")
|
|
|
@Override
|
|
|
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
|
|
|
- log("load package: " + lpparam.packageName);
|
|
|
+ log("load package: " + lpparam.packageName + ", imsi=" + getProperty("persist.spoof.imsi", "unknown"));
|
|
|
+
|
|
|
if ("com.android.phone".equals(lpparam.packageName)) {
|
|
|
executor.schedule(() -> {
|
|
|
log("try to get phone context");
|
|
|
@@ -81,230 +83,250 @@ public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit
|
|
|
}
|
|
|
|
|
|
}, 5, TimeUnit.SECONDS);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
|
|
try {
|
|
|
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
|
|
- Class<?> PhoneInterfaceManager = XposedHelpers.findClass("com.android.phone.PhoneInterfaceManager", lpparam.classLoader);
|
|
|
- XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getLine1NumberForDisplay", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneInterfaceManager.getLine1NumberForDisplay");
|
|
|
- param.setResult(getVar("number", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getNetworkCountryIsoForPhone", int.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneInterfaceManager.getNetworkCountryIsoForPhone");
|
|
|
- param.setResult(getVar("country", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getImeiForSlot", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneInterfaceManager.getImeiForSlot");
|
|
|
- param.setResult(getVar("imei", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getSimStateForSlotIndex", int.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneInterfaceManager.getSimStateForSlotIndex");
|
|
|
- param.setResult(5);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- Class<?> SubscriptionController = XposedHelpers.findClass("com.android.internal.telephony.subscription.SubscriptionManagerService", lpparam.classLoader);
|
|
|
- XposedHelpers.findAndHookMethod(SubscriptionController, "getPhoneNumberFromFirstAvailableSource", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionController.getPhoneNumberFromFirstAvailableSource");
|
|
|
- param.setResult(getVar("number", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- Class<?> SystemProperties = XposedHelpers.findClass("android.os.SystemProperties", lpparam.classLoader);
|
|
|
- XposedHelpers.findAndHookMethod(SubscriptionController, "getActiveSubscriptionInfoList", String.class, String.class, boolean.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionController.getActiveSubscriptionInfoList");
|
|
|
- List<SubscriptionInfo> list = (List<SubscriptionInfo>) param.getResult();
|
|
|
- for (SubscriptionInfo info : list) {
|
|
|
- XposedHelpers.setObjectField(info, "mMcc", getVar("mcc", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mMnc", getVar("mnc", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mCountryIso", getVar("country", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mIccId", getVar("iccid", lpparam.packageName));
|
|
|
- }
|
|
|
+ Class<?> PhoneInterfaceManager = XposedHelpers.findClass("com.android.phone.PhoneInterfaceManager", lpparam.classLoader);
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getLine1NumberForDisplay", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneInterfaceManager.getLine1NumberForDisplay");
|
|
|
+ param.setResult(getProperty("persist.spoof.number", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getNetworkCountryIsoForPhone", int.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneInterfaceManager.getNetworkCountryIsoForPhone");
|
|
|
+ param.setResult(getProperty("persist.spoof.country", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getImeiForSlot", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneInterfaceManager.getImeiForSlot");
|
|
|
+ param.setResult(getProperty("persist.spoof.imei", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getSimStateForSlotIndex", int.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneInterfaceManager.getSimStateForSlotIndex");
|
|
|
+ param.setResult(5);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.iso-country", getVar("country", lpparam.packageName));
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.numeric", getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.operator.numeric", getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- Class<?> PhoneSubInfoController = XposedHelpers.findClass("com.android.internal.telephony.PhoneSubInfoController", lpparam.classLoader);
|
|
|
- XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getIccSerialNumberForSubscriber", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneSubInfoController.getIccSerialNumberForSubscriber");
|
|
|
- param.setResult(getVar("iccid", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getSubscriberIdForSubscriber", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneSubInfoController.getSubscriberIdForSubscriber");
|
|
|
- param.setResult(getVar("imsi", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
-
|
|
|
- XposedHelpers.findAndHookMethod(SystemProperties, "get", String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- String key = (String) param.args[0];
|
|
|
- if ("gsm.sim.operator.iso-country".equals(key)) {
|
|
|
- log("spoof SystemProperties.get(" + key + ")");
|
|
|
- param.setResult(getVar("country", lpparam.packageName));
|
|
|
- } else if ("gsm.sim.operator.numeric".equals(key)) {
|
|
|
- log("spoof SystemProperties.get(" + key + ")");
|
|
|
- param.setResult(getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- } else if ("gsm.operator.numeric".equals(key)) {
|
|
|
- log("spoof SystemProperties.get(" + key + ")");
|
|
|
- param.setResult(getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- } else {
|
|
|
- Class<?> PhoneInterfaceManager = XposedHelpers.findClass("com.android.phone.PhoneInterfaceManager", lpparam.classLoader);
|
|
|
- XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getLine1NumberForDisplay", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneInterfaceManager.getLine1NumberForDisplay");
|
|
|
- param.setResult(getVar("number", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getNetworkCountryIsoForPhone", int.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneInterfaceManager.getNetworkCountryIsoForPhone");
|
|
|
- param.setResult(getVar("country", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getImeiForSlot", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneInterfaceManager.getImeiForSlot");
|
|
|
- param.setResult(getVar("imei", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- Class<?> SubscriptionController = XposedHelpers.findClass("com.android.internal.telephony.SubscriptionController", lpparam.classLoader);
|
|
|
- XposedHelpers.findAndHookMethod(SubscriptionController, "getPhoneNumberFromFirstAvailableSource", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionController.getPhoneNumberFromFirstAvailableSource");
|
|
|
- param.setResult(getVar("number", lpparam.packageName));
|
|
|
+ Class<?> SystemProperties = XposedHelpers.findClass("android.os.SystemProperties", lpparam.classLoader);
|
|
|
+ try {
|
|
|
+ Class<?> SubscriptionController = XposedHelpers.findClass("com.android.internal.telephony.subscription.SubscriptionManagerService", lpparam.classLoader);
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionController, "getPhoneNumberFromFirstAvailableSource", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionController.getPhoneNumberFromFirstAvailableSource");
|
|
|
+ param.setResult(getProperty("persist.spoof.number", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionController, "getActiveSubscriptionInfoList", String.class, String.class, boolean.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionController.getActiveSubscriptionInfoList");
|
|
|
+ List<SubscriptionInfo> list = (List<SubscriptionInfo>) param.getResult();
|
|
|
+ for (SubscriptionInfo info : list) {
|
|
|
+ XposedHelpers.setObjectField(info, "mMcc", getProperty("persist.spoof.mcc", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mMnc", getProperty("persist.spoof.mnc", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mCountryIso", getProperty("persist.spoof.country", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mIccId", getProperty("persist.spoof.iccid", ""));
|
|
|
}
|
|
|
- });
|
|
|
- Class<?> SystemProperties = XposedHelpers.findClass("android.os.SystemProperties", lpparam.classLoader);
|
|
|
- XposedHelpers.findAndHookMethod(SubscriptionController, "getActiveSubscriptionInfoList", String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionController.getActiveSubscriptionInfoList");
|
|
|
- List<SubscriptionInfo> list = (List<SubscriptionInfo>) param.getResult();
|
|
|
- for (SubscriptionInfo info : list) {
|
|
|
- XposedHelpers.setObjectField(info, "mMcc", getVar("mcc", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mMnc", getVar("mnc", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mCountryIso", getVar("country", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mIccId", getVar("iccid", lpparam.packageName));
|
|
|
- }
|
|
|
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.iso-country", getVar("country", lpparam.packageName));
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.numeric", getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.operator.numeric", getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(SubscriptionController, "getActiveSubscriptionInfoList", String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionController.getActiveSubscriptionInfoList");
|
|
|
- List<SubscriptionInfo> list = (List<SubscriptionInfo>) param.getResult();
|
|
|
- for (SubscriptionInfo info : list) {
|
|
|
- XposedHelpers.setObjectField(info, "mMcc", getVar("mcc", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mMnc", getVar("mnc", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mCountryIso", getVar("country", lpparam.packageName));
|
|
|
- XposedHelpers.setObjectField(info, "mIccId", getVar("iccid", lpparam.packageName));
|
|
|
- }
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.iso-country", getProperty("persist.spoof.country", ""));
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.numeric", getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.operator.numeric", getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.iso-country", getVar("country", lpparam.packageName));
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.numeric", getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.operator.numeric", getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(SubscriptionController, "getSimStateForSlotIndex", int.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionController.getSimStateForSlotIndex");
|
|
|
- param.setResult(5);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- Class<?> PhoneSubInfoController = XposedHelpers.findClass("com.android.internal.telephony.PhoneSubInfoController", lpparam.classLoader);
|
|
|
- XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getIccSerialNumberForSubscriber", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneSubInfoController.getIccSerialNumberForSubscriber");
|
|
|
- param.setResult(getVar("iccid", lpparam.packageName));
|
|
|
- }
|
|
|
- });
|
|
|
- XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getSubscriberIdForSubscriber", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof PhoneSubInfoController.getSubscriberIdForSubscriber");
|
|
|
- param.setResult(getVar("imsi", lpparam.packageName));
|
|
|
+
|
|
|
+ try {
|
|
|
+ Class<?> PhoneSubInfoController = XposedHelpers.findClass("com.android.internal.telephony.PhoneSubInfoController", lpparam.classLoader);
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getIccSerialNumberForSubscriber", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneSubInfoController.getIccSerialNumberForSubscriber");
|
|
|
+ param.setResult(getProperty("persist.spoof.iccid", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getSubscriberIdForSubscriber", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneSubInfoController.getSubscriberIdForSubscriber");
|
|
|
+ param.setResult(getProperty("persist.spoof.imsi", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ XposedHelpers.findAndHookMethod(SystemProperties, "get", String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ String key = (String) param.args[0];
|
|
|
+ if ("gsm.sim.operator.iso-country".equals(key)) {
|
|
|
+ log("spoof SystemProperties.get(" + key + ")");
|
|
|
+ param.setResult(getProperty("persist.spoof.country", ""));
|
|
|
+ } else if ("gsm.sim.operator.numeric".equals(key)) {
|
|
|
+ log("spoof SystemProperties.get(" + key + ")");
|
|
|
+ param.setResult(getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ } else if ("gsm.operator.numeric".equals(key)) {
|
|
|
+ log("spoof SystemProperties.get(" + key + ")");
|
|
|
+ param.setResult(getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ Class<?> PhoneInterfaceManager = XposedHelpers.findClass("com.android.phone.PhoneInterfaceManager", lpparam.classLoader);
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getLine1NumberForDisplay", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneInterfaceManager.getLine1NumberForDisplay");
|
|
|
+ param.setResult(getProperty("persist.spoof.number", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getNetworkCountryIsoForPhone", int.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneInterfaceManager.getNetworkCountryIsoForPhone");
|
|
|
+ param.setResult(getProperty("persist.spoof.country", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getImeiForSlot", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneInterfaceManager.getImeiForSlot");
|
|
|
+ param.setResult(getProperty("persist.spoof.imei", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ Class<?> SystemProperties = XposedHelpers.findClass("android.os.SystemProperties", lpparam.classLoader);
|
|
|
+ try {
|
|
|
+ Class<?> SubscriptionController = XposedHelpers.findClass("com.android.internal.telephony.SubscriptionController", lpparam.classLoader);
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionController, "getPhoneNumberFromFirstAvailableSource", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionController.getPhoneNumberFromFirstAvailableSource");
|
|
|
+ param.setResult(getProperty("persist.spoof.number", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionController, "getActiveSubscriptionInfoList", String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionController.getActiveSubscriptionInfoList");
|
|
|
+ List<SubscriptionInfo> list = (List<SubscriptionInfo>) param.getResult();
|
|
|
+ for (SubscriptionInfo info : list) {
|
|
|
+ XposedHelpers.setObjectField(info, "mMcc", getProperty("persist.spoof.mcc", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mMnc", getProperty("persist.spoof.mnc", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mCountryIso", getProperty("persist.spoof.country", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mIccId", getProperty("persist.spoof.iccid", ""));
|
|
|
}
|
|
|
- });
|
|
|
-
|
|
|
-
|
|
|
- XposedHelpers.findAndHookMethod(SystemProperties, "get", String.class, new XC_MethodHook() {
|
|
|
- @Override
|
|
|
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- String key = (String) param.args[0];
|
|
|
- if ("gsm.sim.operator.iso-country".equals(key)) {
|
|
|
- log("spoof SystemProperties.get(" + key + ")");
|
|
|
- param.setResult(getVar("country", lpparam.packageName));
|
|
|
- } else if ("gsm.sim.operator.numeric".equals(key)) {
|
|
|
- log("spoof SystemProperties.get(" + key + ")");
|
|
|
- param.setResult(getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- } else if ("gsm.operator.numeric".equals(key)) {
|
|
|
- log("spoof SystemProperties.get(" + key + ")");
|
|
|
- param.setResult(getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- }
|
|
|
+
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.iso-country", getProperty("persist.spoof.country", ""));
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.numeric", getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.operator.numeric", getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionController, "getActiveSubscriptionInfoList", String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionController.getActiveSubscriptionInfoList");
|
|
|
+ List<SubscriptionInfo> list = (List<SubscriptionInfo>) param.getResult();
|
|
|
+ for (SubscriptionInfo info : list) {
|
|
|
+ XposedHelpers.setObjectField(info, "mMcc", getProperty("persist.spoof.mcc", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mMnc", getProperty("persist.spoof.mnc", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mCountryIso", getProperty("persist.spoof.country", ""));
|
|
|
+ XposedHelpers.setObjectField(info, "mIccId", getProperty("persist.spoof.iccid", ""));
|
|
|
}
|
|
|
- });
|
|
|
- }
|
|
|
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.iso-country", getProperty("persist.spoof.country", ""));
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.numeric", getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.operator.numeric", getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionController, "getSimStateForSlotIndex", int.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionController.getSimStateForSlotIndex");
|
|
|
+ param.setResult(5);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
|
|
|
+ try {
|
|
|
+ Class<?> PhoneSubInfoController = XposedHelpers.findClass("com.android.internal.telephony.PhoneSubInfoController", lpparam.classLoader);
|
|
|
+ log("PhoneSubInfoController: " + lpparam.packageName);
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getIccSerialNumberForSubscriber", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneSubInfoController.getIccSerialNumberForSubscriber");
|
|
|
+ param.setResult(getProperty("persist.spoof.iccid", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getSubscriberIdForSubscriber", int.class, String.class, String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof PhoneSubInfoController.getSubscriberIdForSubscriber");
|
|
|
+ param.setResult(getProperty("persist.spoof.imsi", ""));
|
|
|
+ }
|
|
|
+ });
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
|
|
|
- return;
|
|
|
+ XposedHelpers.findAndHookMethod(SystemProperties, "get", String.class, new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ String key = (String) param.args[0];
|
|
|
+ if ("gsm.sim.operator.iso-country".equals(key)) {
|
|
|
+ log("spoof SystemProperties.get(" + key + ")");
|
|
|
+ param.setResult(getProperty("persist.spoof.country", ""));
|
|
|
+ } else if ("gsm.sim.operator.numeric".equals(key)) {
|
|
|
+ log("spoof SystemProperties.get(" + key + ")");
|
|
|
+ param.setResult(getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ } else if ("gsm.operator.numeric".equals(key)) {
|
|
|
+ log("spoof SystemProperties.get(" + key + ")");
|
|
|
+ param.setResult(getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
+
|
|
|
Class<?> SubscriptionManager = XposedHelpers.findClass("android.telephony.SubscriptionManager", lpparam.classLoader);
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionManager, "getPhoneNumber", int.class, new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
log("spoof SubscriptionManager.getPhoneNumber");
|
|
|
- param.setResult(getVar("number", lpparam.packageName));
|
|
|
+ param.setResult(getProperty("persist.spoof.number", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionManager, "getPhoneNumber", int.class, int.class, new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
log("spoof SubscriptionManager.getPhoneNumber");
|
|
|
- param.setResult(getVar("number", lpparam.packageName));
|
|
|
+ param.setResult(getProperty("persist.spoof.number", ""));
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -312,50 +334,50 @@ public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMcc", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionInfo.getMcc -> " + getVar("mcc", lpparam.packageName));
|
|
|
- param.setResult(Integer.parseInt(getVar("mcc", lpparam.packageName)));
|
|
|
+ log("spoof SubscriptionInfo.getMcc -> " + getProperty("persist.spoof.mcc", ""));
|
|
|
+ param.setResult(Integer.parseInt(getProperty("persist.spoof.mcc", "")));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMnc", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionInfo.getMnc -> " + getVar("mnc", lpparam.packageName));
|
|
|
- param.setResult(Integer.parseInt(getVar("mnc", lpparam.packageName)));
|
|
|
+ log("spoof SubscriptionInfo.getMnc -> " + getProperty("persist.spoof.mnc", ""));
|
|
|
+ param.setResult(Integer.parseInt(getProperty("persist.spoof.mnc", "")));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMccString", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionInfo.getMccString -> " + getVar("mcc", lpparam.packageName));
|
|
|
- param.setResult(getVar("mcc", lpparam.packageName));
|
|
|
+ log("spoof SubscriptionInfo.getMccString -> " + getProperty("persist.spoof.mcc", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.mcc", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMncString", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionInfo.getMncString -> " + getVar("mnc", lpparam.packageName));
|
|
|
- param.setResult(getVar("mnc", lpparam.packageName));
|
|
|
+ log("spoof SubscriptionInfo.getMncString -> " + getProperty("persist.spoof.mnc", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.mnc", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionInfo, "getNumber", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionInfo.getNumber -> " + getVar("number", lpparam.packageName));
|
|
|
- param.setResult(getVar("number", lpparam.packageName));
|
|
|
+ log("spoof SubscriptionInfo.getNumber -> " + getProperty("persist.spoof.number", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.number", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionInfo, "getIccId", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionInfo.getIccId -> " + getVar("iccid", lpparam.packageName));
|
|
|
- param.setResult(getVar("iccid", lpparam.packageName));
|
|
|
+ log("spoof SubscriptionInfo.getIccId -> " + getProperty("persist.spoof.iccid", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.iccid", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(SubscriptionInfo, "getCountryIso", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof SubscriptionInfo.getCountryIso -> " + getVar("country", lpparam.packageName));
|
|
|
- param.setResult(getVar("country", lpparam.packageName));
|
|
|
+ log("spoof SubscriptionInfo.getCountryIso -> " + getProperty("persist.spoof.country", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.country", ""));
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -364,57 +386,57 @@ public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit
|
|
|
XposedHelpers.findAndHookMethod(TelephonyManager, "getLine1Number", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof TelephonyManager.getLine1Number -> " + getVar("number", lpparam.packageName));
|
|
|
- param.setResult(getVar("number", lpparam.packageName));
|
|
|
+ log("spoof TelephonyManager.getLine1Number -> " + getProperty("persist.spoof.number", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.number", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(TelephonyManager, "getSimOperator", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof TelephonyManager.getSimOperator -> " + getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- param.setResult(getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
+ log("spoof TelephonyManager.getSimOperator -> " + getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(TelephonyManager, "getNetworkOperator", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof TelephonyManager.getNetworkOperator -> " + getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
- param.setResult(getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
|
|
|
+ log("spoof TelephonyManager.getNetworkOperator -> " + getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.mcc", "") + getProperty("persist.spoof.mnc", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(TelephonyManager, "getSimSerialNumber", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof TelephonyManager.getSimSerialNumber -> " + getVar("iccid", lpparam.packageName));
|
|
|
- param.setResult(getVar("iccid", lpparam.packageName));
|
|
|
+ log("spoof TelephonyManager.getSimSerialNumber -> " + getProperty("persist.spoof.iccid", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.iccid", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(TelephonyManager, "getSubscriberId", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof TelephonyManager.getSubscriberId -> " + getVar("imsi", lpparam.packageName));
|
|
|
- param.setResult(getVar("imsi", lpparam.packageName));
|
|
|
+ log("spoof TelephonyManager.getSubscriberId -> " + getProperty("persist.spoof.imsi", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.imsi", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(TelephonyManager, "getImei", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof TelephonyManager.getImei -> " + getVar("imei", lpparam.packageName));
|
|
|
- param.setResult(getVar("imei", lpparam.packageName));
|
|
|
+ log("spoof TelephonyManager.getImei -> " + getProperty("persist.spoof.imei", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.imei", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(TelephonyManager, "getNetworkCountryIso", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof TelephonyManager.getNetworkCountryIso -> " + getVar("country", lpparam.packageName));
|
|
|
- param.setResult(getVar("country", lpparam.packageName));
|
|
|
+ log("spoof TelephonyManager.getNetworkCountryIso -> " + getProperty("persist.spoof.country", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.country", ""));
|
|
|
}
|
|
|
});
|
|
|
XposedHelpers.findAndHookMethod(TelephonyManager, "getSimCountryIso", new XC_MethodHook() {
|
|
|
@Override
|
|
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
- log("spoof TelephonyManager.getSimCountryIso -> " + getVar("country", lpparam.packageName));
|
|
|
- param.setResult(getVar("country", lpparam.packageName));
|
|
|
+ log("spoof TelephonyManager.getSimCountryIso -> " + getProperty("persist.spoof.country", ""));
|
|
|
+ param.setResult(getProperty("persist.spoof.country", ""));
|
|
|
}
|
|
|
});
|
|
|
//getSimState
|
|
|
@@ -437,23 +459,36 @@ public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit
|
|
|
XposedBridge.log(TAG + ": " + message);
|
|
|
}
|
|
|
|
|
|
- private String getVar(String key, String packageName) {
|
|
|
- @SuppressLint("SdCardPath")
|
|
|
- File file = new File("/data/data/" + packageName + "/rcsConfig.json");
|
|
|
- if (!file.exists()) {
|
|
|
- log("file " + file.getPath() + " not exist");
|
|
|
- return "";
|
|
|
- }
|
|
|
- String json = null;
|
|
|
+// private String getVar(String key, String packageName) {
|
|
|
+// @SuppressLint("SdCardPath")
|
|
|
+// File file = new File("/data/data/" + packageName + "/rcsConfig.json");
|
|
|
+// if (!file.exists()) {
|
|
|
+// log("file " + file.getPath() + " not exist");
|
|
|
+// return "";
|
|
|
+// }
|
|
|
+// String json = null;
|
|
|
+// try {
|
|
|
+// json = FileUtils.readFileToString(file, "UTF-8");
|
|
|
+// JSONObject obj = new JSONObject(json);
|
|
|
+// return obj.getString(key);
|
|
|
+// } catch (IOException e) {
|
|
|
+// log("IOException: " + e.getMessage());
|
|
|
+// } catch (JSONException e) {
|
|
|
+// log("JSONException: " + e.getMessage());
|
|
|
+// }
|
|
|
+// return "";
|
|
|
+// }
|
|
|
+
|
|
|
+ public String getProperty(String key, String defaultValue) {
|
|
|
+ String value = defaultValue;
|
|
|
try {
|
|
|
- json = FileUtils.readFileToString(file, "UTF-8");
|
|
|
- JSONObject obj = new JSONObject(json);
|
|
|
- return obj.getString(key);
|
|
|
- } catch (IOException e) {
|
|
|
- log("IOException: " + e.getMessage());
|
|
|
- } catch (JSONException e) {
|
|
|
- log("JSONException: " + e.getMessage());
|
|
|
+ Class<?> c = Class.forName("android.os.SystemProperties");
|
|
|
+ Method get = c.getMethod("get", String.class, String.class);
|
|
|
+ value = (String) (get.invoke(c, key, "unknown"));
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ return value;
|
|
|
}
|
|
|
- return "";
|
|
|
}
|
|
|
}
|