x1ongzhu 1 tahun lalu
induk
melakukan
439ee0ea9f

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -32,6 +32,7 @@
         <meta-data
             android:name="xposedscope"
             android:resource="@array/xposed_scope" />
+
     </application>
 
 </manifest>

+ 279 - 244
app/src/main/java/com/example/modifiermodule/XposedInit.java

@@ -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 "";
     }
 }