|
|
@@ -0,0 +1,243 @@
|
|
|
+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.util.Log;
|
|
|
+
|
|
|
+import org.apache.commons.io.FileUtils;
|
|
|
+import org.apache.commons.lang3.ClassUtils;
|
|
|
+import org.json.JSONObject;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
+import java.util.concurrent.Executors;
|
|
|
+import java.util.concurrent.ScheduledThreadPoolExecutor;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+import de.robv.android.xposed.IXposedHookInitPackageResources;
|
|
|
+import de.robv.android.xposed.IXposedHookLoadPackage;
|
|
|
+import de.robv.android.xposed.IXposedHookZygoteInit;
|
|
|
+import de.robv.android.xposed.XC_MethodHook;
|
|
|
+import de.robv.android.xposed.XSharedPreferences;
|
|
|
+import de.robv.android.xposed.XposedBridge;
|
|
|
+import de.robv.android.xposed.XposedHelpers;
|
|
|
+import de.robv.android.xposed.callbacks.XC_InitPackageResources;
|
|
|
+import de.robv.android.xposed.callbacks.XC_LoadPackage;
|
|
|
+
|
|
|
+@SuppressLint("DefaultLocale")
|
|
|
+public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit, IXposedHookInitPackageResources {
|
|
|
+ private static final String TAG = "ModifierModule";
|
|
|
+ private ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
|
|
|
+ log("load package: " + lpparam.packageName);
|
|
|
+ if ("com.android.phone".equals(lpparam.packageName)) {
|
|
|
+ executor.schedule(() -> {
|
|
|
+ log("try to get phone context");
|
|
|
+ try {
|
|
|
+ Class<?> ActivityThread = XposedHelpers.findClass("android.app.ActivityThread", lpparam.classLoader);
|
|
|
+ Object currentActivityThread = XposedHelpers.callStaticMethod(ActivityThread, "currentActivityThread");
|
|
|
+ Application application = (Application) XposedHelpers.callMethod(currentActivityThread, "getApplication");
|
|
|
+
|
|
|
+ if (application == null) {
|
|
|
+ log("get phone context failed: null");
|
|
|
+ } else {
|
|
|
+ log("get phone context success");
|
|
|
+ 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) {
|
|
|
+ log("get phone context failed: " + e.getMessage());
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ }, 5, TimeUnit.SECONDS);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ File file = new File("/data/data/" + lpparam.packageName + "/rcsConfig.json");
|
|
|
+ if (!file.exists()) {
|
|
|
+ log("file " + file.getPath() + " not exist");
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ Class<?> SubscriptionInfo = XposedHelpers.findClass("android.telephony.SubscriptionInfo", lpparam.classLoader);
|
|
|
+ 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));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ 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));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMccString", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionInfo.getMccString -> " + mcc);
|
|
|
+ param.setResult(mcc);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionInfo, "getMncString", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionInfo.getMncString -> " + mnc);
|
|
|
+ param.setResult(mnc);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionInfo, "getNumber", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionInfo.getNumber -> " + number);
|
|
|
+ param.setResult(number);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionInfo, "getIccId", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionInfo.getIccId -> " + iccid);
|
|
|
+ param.setResult(iccid);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(SubscriptionInfo, "getCountryIso", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof SubscriptionInfo.getCountryIso -> " + country);
|
|
|
+ param.setResult(country);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ Class<?> TelephonyManager = XposedHelpers.findClass("android.telephony.TelephonyManager", lpparam.classLoader);
|
|
|
+ XposedHelpers.findAndHookMethod(TelephonyManager, "getLine1Number", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof TelephonyManager.getLine1Number -> " + number);
|
|
|
+ param.setResult(number);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(TelephonyManager, "getSimSerialNumber", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof TelephonyManager.getSimSerialNumber -> " + iccid);
|
|
|
+ param.setResult(iccid);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(TelephonyManager, "getSubscriberId", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof TelephonyManager.getSubscriberId -> " + imsi);
|
|
|
+ param.setResult(imsi);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(TelephonyManager, "getImei", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof TelephonyManager.getImei -> " + imei);
|
|
|
+ param.setResult(imei);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(TelephonyManager, "getNetworkCountryIso", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof TelephonyManager.getNetworkCountryIso -> " + country);
|
|
|
+ param.setResult(country);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ XposedHelpers.findAndHookMethod(TelephonyManager, "getSimCountryIso", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof TelephonyManager.getSimCountryIso -> " + country);
|
|
|
+ param.setResult(country);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ //getSimState
|
|
|
+ XposedHelpers.findAndHookMethod(TelephonyManager, "getSimState", new XC_MethodHook() {
|
|
|
+ @Override
|
|
|
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
|
|
+ log("spoof TelephonyManager.getSimState -> 5");
|
|
|
+ param.setResult(5);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void initZygote(StartupParam startupParam) throws Throwable {
|
|
|
+ log("initZygote");
|
|
|
+ }
|
|
|
+
|
|
|
+ private void log(String message) {
|
|
|
+ Log.i(TAG, message);
|
|
|
+ XposedBridge.log(TAG + ": " + message);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|