package com.example.modifiermodule; import android.telephony.SubscriptionInfo; import java.util.List; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; public class Hook13 extends BaseHook { public Hook13(ClassLoader classLoader) { super(classLoader); } public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { if (!lpparam.packageName.equals("com.android.phone")) { return; } 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(PROP_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(PROP_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(PROP_IMEI, "")); } }); XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getMeidForSlot", int.class, String.class, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("spoof PhoneInterfaceManager.getMeidForSlot"); String imei = getProperty(PROP_IMEI, ""); String meid = imei; if (imei.length() > 14) { meid = imei.substring(0, 14); } param.setResult(meid); } }); XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getSubscriptionSpecificCarrierId", int.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) { int carrierId = getIntProperty(PROP_CARRIER_ID, -1); if (carrierId != -1) { log("spoof PhoneInterfaceManager.getSubscriptionSpecificCarrierId"); param.setResult(carrierId); } } }); XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getSubscriptionCarrierId", int.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) { log("spoof PhoneInterfaceManager.getSubscriptionCarrierId"); int carrierId = getIntProperty(PROP_CARRIER_ID, -1); if (carrierId != -1) { param.setResult(carrierId); } } }); XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getDeviceIdWithFeature", String.class, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) { log("spoof PhoneInterfaceManager.getDeviceIdWithFeature"); param.setResult(getProperty(PROP_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(PROP_NUMBER, "")); } }); XposedHelpers.findAndHookMethod(SubscriptionController, "getActiveSubscriptionInfoList", String.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { log("spoof SubscriptionController.getActiveSubscriptionInfoList"); List list = (List) param.getResult(); for (SubscriptionInfo info : list) { XposedHelpers.setObjectField(info, "mMcc", getProperty(PROP_MCC, "")); XposedHelpers.setObjectField(info, "mMnc", getProperty(PROP_MNC, "")); XposedHelpers.setObjectField(info, "mCountryIso", getProperty(PROP_COUNTRY, "")); XposedHelpers.setObjectField(info, "mIccId", getProperty(PROP_ICCID, "")); int carrierId = getIntProperty(PROP_CARRIER_ID, -1); if (carrierId != -1) { XposedHelpers.setObjectField(info, "mCarrierId", carrierId); } } XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.iso-country", getProperty(PROP_COUNTRY, "")); XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.numeric", getProperty(PROP_MCC, "") + getProperty(PROP_MNC, "")); XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.operator.numeric", getProperty(PROP_MCC, "") + getProperty(PROP_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 list = (List) param.getResult(); for (SubscriptionInfo info : list) { XposedHelpers.setObjectField(info, "mMcc", getProperty(PROP_MCC, "")); XposedHelpers.setObjectField(info, "mMnc", getProperty(PROP_MNC, "")); XposedHelpers.setObjectField(info, "mCountryIso", getProperty(PROP_COUNTRY, "")); XposedHelpers.setObjectField(info, "mIccId", getProperty(PROP_ICCID, "")); int carrierId = getIntProperty(PROP_CARRIER_ID, -1); if (carrierId != -1) { XposedHelpers.setObjectField(info, "mCarrierId", carrierId); } } XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.iso-country", getProperty(PROP_COUNTRY, "")); XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.sim.operator.numeric", getProperty(PROP_MCC, "") + getProperty(PROP_MNC, "")); XposedHelpers.callStaticMethod(SystemProperties, "set", "gsm.operator.numeric", getProperty(PROP_MCC, "") + getProperty(PROP_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(PROP_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(PROP_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(PROP_COUNTRY, "")); } else if ("gsm.sim.operator.numeric".equals(key)) { log("spoof SystemProperties.get(" + key + ")"); param.setResult(getProperty(PROP_MCC, "") + getProperty(PROP_MNC, "")); } else if ("gsm.operator.numeric".equals(key)) { log("spoof SystemProperties.get(" + key + ")"); param.setResult(getProperty(PROP_MCC, "") + getProperty(PROP_MNC, "")); } } }); try { Class CarrierResolver = XposedHelpers.findClass("com.android.internal.telephony.CarrierResolver", lpparam.classLoader); XposedHelpers.findAndHookMethod(CarrierResolver, "getCarrierIdFromSimMccMnc", String.class, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("spoof CarrierResolver.getCarrierIdFromSimMccMnc"); int carrierId = getIntProperty(PROP_CARRIER_ID, -1); if (carrierId != -1) { param.setResult(carrierId); } } }); } catch (Exception e) { e.printStackTrace(); } } }