package com.example.modifiermodule; import android.annotation.SuppressLint; import android.app.Application; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.telephony.SubscriptionInfo; import java.io.File; import java.util.List; import java.util.Optional; 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); } @SuppressLint("UnspecifiedRegisterReceiverFlag") public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { if (!lpparam.packageName.equals("com.android.phone")) { return; } try { Class PhoneApp = XposedHelpers.findClass("com.android.phone.PhoneApp", lpparam.classLoader); XposedHelpers.findAndHookMethod(PhoneApp, "onCreate", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { log("PhoneApp.onCreate"); Application application = (Application) param.thisObject; File configFile = new File(application.getFilesDir(), "config.json"); configFile.setReadOnly(); setConfigFile(configFile); IntentFilter filter = new IntentFilter("com.example.modifier.sms"); application.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String sender = Optional.ofNullable(intent.getStringExtra("sender")).orElse("1234"); String message = Optional.ofNullable(intent.getStringExtra("message")).orElse("test"); Intent i1 = RcsHackTool.createSmsIntent(application, sender, message); i1.setAction("android.provider.Telephony.SMS_RECEIVED"); application.sendBroadcast(i1); i1.setAction("android.provider.Telephony.SMS_DELIVER"); application.sendBroadcast(i1); } }, filter); log("register broadcast receiver success"); } }); } catch (Exception e) { e.printStackTrace(); } 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, "")); } }); XposedHelpers.findAndHookMethod(PhoneInterfaceManager, "getDeviceIdForPhone", String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) { log("spoof PhoneInterfaceManager.getDeviceId"); 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, "")); } }); XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getDeviceId", String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("spoof PhoneSubInfoController.getDeviceIdForPhone"); param.setResult(getProperty(PROP_IMEI, "")); } }); XposedHelpers.findAndHookMethod(PhoneSubInfoController, "getDeviceIdForPhone", int.class, String.class, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { log("spoof PhoneSubInfoController.getDeviceIdForPhone"); param.setResult(getProperty(PROP_IMEI, "")); } }); } 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", 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(); } } }