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