xiongzhu 1 năm trước cách đây
mục cha
commit
8fe4907831
1 tập tin đã thay đổi với 168 bổ sung47 xóa
  1. 168 47
      app/src/main/java/com/example/modifiermodule/XposedInit.java

+ 168 - 47
app/src/main/java/com/example/modifiermodule/XposedInit.java

@@ -6,13 +6,17 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.telephony.SubscriptionInfo;
 import android.util.Log;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.ClassUtils;
+import org.json.JSONException;
 import org.json.JSONObject;
 
 import java.io.File;
+import java.io.IOException;
+import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -38,6 +42,7 @@ public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit
     public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable {
     }
 
+    @SuppressLint("UnspecifiedRegisterReceiverFlag")
     @Override
     public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
         log("load package: " + lpparam.packageName);
@@ -76,38 +81,135 @@ public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit
                 }
 
             }, 5, TimeUnit.SECONDS);
-            return;
-        }
 
-        File file = new File("/data/data/" + lpparam.packageName + "/rcsConfig.json");
-        if (!file.exists()) {
-            log("file " + file.getPath() + " not exist");
+            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(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);
+                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", 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));
+                    }
+                });
+
+
+                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));
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
             return;
         }
-        String json = FileUtils.readFileToString(file, "UTF-8");
-        log("json: " + json);
-        JSONObject obj = new JSONObject(json);
-        String mnc = obj.getString("mnc");
-        String mcc = obj.getString("mcc");
-        String iccid = obj.getString("iccid");
-        String imsi = obj.getString("imsi");
-        String imei = obj.getString("imei");
-        String number = obj.getString("number");
-        String country = obj.getString("country");
 
         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(number);
+                param.setResult(getVar("number", lpparam.packageName));
             }
         });
         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(number);
+                param.setResult(getVar("number", lpparam.packageName));
             }
         });
 
@@ -115,50 +217,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 -> " + mcc);
-                param.setResult(Integer.parseInt(mcc));
+                log("spoof SubscriptionInfo.getMcc -> " + getVar("mcc", lpparam.packageName));
+                param.setResult(Integer.parseInt(getVar("mcc", lpparam.packageName)));
             }
         });
         XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMnc", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof SubscriptionInfo.getMnc -> " + mnc);
-                param.setResult(Integer.parseInt(mnc));
+                log("spoof SubscriptionInfo.getMnc -> " + getVar("mnc", lpparam.packageName));
+                param.setResult(Integer.parseInt(getVar("mnc", lpparam.packageName)));
             }
         });
         XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMccString", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof SubscriptionInfo.getMccString -> " + mcc);
-                param.setResult(mcc);
+                log("spoof SubscriptionInfo.getMccString -> " + getVar("mcc", lpparam.packageName));
+                param.setResult(getVar("mcc", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMncString", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof SubscriptionInfo.getMncString -> " + mnc);
-                param.setResult(mnc);
+                log("spoof SubscriptionInfo.getMncString -> " + getVar("mnc", lpparam.packageName));
+                param.setResult(getVar("mnc", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(SubscriptionInfo, "getNumber", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof SubscriptionInfo.getNumber -> " + number);
-                param.setResult(number);
+                log("spoof SubscriptionInfo.getNumber -> " + getVar("number", lpparam.packageName));
+                param.setResult(getVar("number", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(SubscriptionInfo, "getIccId", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof SubscriptionInfo.getIccId -> " + iccid);
-                param.setResult(iccid);
+                log("spoof SubscriptionInfo.getIccId -> " + getVar("iccid", lpparam.packageName));
+                param.setResult(getVar("iccid", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(SubscriptionInfo, "getCountryIso", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof SubscriptionInfo.getCountryIso -> " + country);
-                param.setResult(country);
+                log("spoof SubscriptionInfo.getCountryIso -> " + getVar("country", lpparam.packageName));
+                param.setResult(getVar("country", lpparam.packageName));
             }
         });
 
@@ -167,57 +269,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 -> " + number);
-                param.setResult(number);
+                log("spoof TelephonyManager.getLine1Number -> " + getVar("number", lpparam.packageName));
+                param.setResult(getVar("number", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(TelephonyManager, "getSimOperator", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof TelephonyManager.getSimOperator -> " + mcc + mnc);
-                param.setResult(mcc + mnc);
+                log("spoof TelephonyManager.getSimOperator -> " + getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
+                param.setResult(getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(TelephonyManager, "getNetworkOperator", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof TelephonyManager.getNetworkOperator -> " + mcc + mnc);
-                param.setResult(mcc + mnc);
+                log("spoof TelephonyManager.getNetworkOperator -> " + getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
+                param.setResult(getVar("mcc", lpparam.packageName) + getVar("mnc", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(TelephonyManager, "getSimSerialNumber", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof TelephonyManager.getSimSerialNumber -> " + iccid);
-                param.setResult(iccid);
+                log("spoof TelephonyManager.getSimSerialNumber -> " + getVar("iccid", lpparam.packageName));
+                param.setResult(getVar("iccid", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(TelephonyManager, "getSubscriberId", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof TelephonyManager.getSubscriberId -> " + imsi);
-                param.setResult(imsi);
+                log("spoof TelephonyManager.getSubscriberId -> " + getVar("imsi", lpparam.packageName));
+                param.setResult(getVar("imsi", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(TelephonyManager, "getImei", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof TelephonyManager.getImei -> " + imei);
-                param.setResult(imei);
+                log("spoof TelephonyManager.getImei -> " + getVar("imei", lpparam.packageName));
+                param.setResult(getVar("imei", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(TelephonyManager, "getNetworkCountryIso", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof TelephonyManager.getNetworkCountryIso -> " + country);
-                param.setResult(country);
+                log("spoof TelephonyManager.getNetworkCountryIso -> " + getVar("country", lpparam.packageName));
+                param.setResult(getVar("country", lpparam.packageName));
             }
         });
         XposedHelpers.findAndHookMethod(TelephonyManager, "getSimCountryIso", new XC_MethodHook() {
             @Override
             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
-                log("spoof TelephonyManager.getSimCountryIso -> " + country);
-                param.setResult(country);
+                log("spoof TelephonyManager.getSimCountryIso -> " + getVar("country", lpparam.packageName));
+                param.setResult(getVar("country", lpparam.packageName));
             }
         });
         //getSimState
@@ -240,4 +342,23 @@ 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;
+        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 "";
+    }
 }