xiongzhu пре 10 месеци
родитељ
комит
ca45fa403e

+ 41 - 22
app/src/main/java/com/example/modifiermodule/BaseHook.java

@@ -2,19 +2,14 @@ package com.example.modifiermodule;
 
 import android.annotation.SuppressLint;
 import android.app.Application;
-import android.content.ContentResolver;
 import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
 import android.text.TextUtils;
-import android.util.Base64;
 import android.util.Log;
 
 import org.apache.commons.io.FileUtils;
 import org.json.JSONObject;
 
 import java.io.File;
-import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
 
 import de.robv.android.xposed.XposedBridge;
@@ -51,6 +46,10 @@ public class BaseHook {
 
     static final String TAG = "ModifierModule";
 
+    private JSONObject config = null;
+    private File configFile = null;
+    private ConfigFileObserver configFileObserver = null;
+
     public BaseHook(ClassLoader classLoader) {
         this.classLoader = classLoader;
     }
@@ -92,34 +91,54 @@ public class BaseHook {
 //        return value;
 //    }
 
-    @SuppressLint("PrivateApi")
-    public String getProperty(String key, String defaultValue) {
-        String value = defaultValue;
+    public void setConfigFile(File configFile) {
+        this.configFile = configFile;
+    }
+
+    public void readAndObserve() {
+        if (configFileObserver != null) {
+            configFileObserver.stopWatching();
+        }
+        if (configFile != null) {
+            readConfig();
+            configFileObserver = new ConfigFileObserver(configFile, () -> readConfig());
+            configFileObserver.startWatching();
+        }
+    }
+
+    public void readConfig() {
         try {
-            Context context = getContext();
-            String packageName = context.getPackageName();
-            File configFile;
-            if (packageName.equals("android")) {
-                configFile = new File("/data/system/config.json");
-            } else if (packageName.equals("com.android.phone")) {
-                configFile = new File(context.getExternalFilesDir("config"), "config.json");
-            } else {
-                return defaultValue;
+            log("readConfig: " + configFile.getAbsolutePath());
+            if (!configFile.exists()) {
+                new File(configFile.getAbsolutePath()).getParentFile().mkdirs();
+                new File(configFile.getAbsolutePath()).createNewFile();
             }
             if (configFile.exists()) {
                 String json = FileUtils.readFileToString(configFile, StandardCharsets.UTF_8);
                 if (!TextUtils.isEmpty(json)) {
-                    JSONObject jsonObject = new JSONObject(json);
-                    if (jsonObject.has(key)) {
-                        value = jsonObject.getString(key);
-                    }
+                    config = new JSONObject(json);
                 }
             }
+        } catch (Exception e) {
+            log("BaseHook: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    @SuppressLint("PrivateApi")
+    public String getProperty(String key, String defaultValue) {
+        try {
+            if (config == null) {
+                readAndObserve();
+            }
+            if (config != null && config.has(key)) {
+                return config.optString(key, defaultValue);
+            }
         } catch (Exception e) {
             log("getProperty: " + e.getMessage());
             e.printStackTrace();
         }
-        return value;
+        return defaultValue;
     }
 
     public int getIntProperty(String key, int defaultValue) {

+ 31 - 0
app/src/main/java/com/example/modifiermodule/ConfigFileObserver.java

@@ -0,0 +1,31 @@
+package com.example.modifiermodule;
+
+import android.os.FileObserver;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.io.File;
+import java.util.List;
+
+public class ConfigFileObserver extends FileObserver {
+    interface ConfigFileObserverListener {
+        void onConfigChanged();
+    }
+
+    private ConfigFileObserverListener listener;
+
+    public ConfigFileObserver(@NonNull File file, ConfigFileObserverListener listener) {
+        super(file, FileObserver.CLOSE_WRITE);
+        this.listener = listener;
+    }
+
+    @Override
+    public void onEvent(int event, @Nullable String path) {
+        Log.i("ConfigFileObserver", "onEvent: " + event + " " + path);
+        if (listener != null) {
+            listener.onConfigChanged();
+        }
+    }
+}

+ 40 - 0
app/src/main/java/com/example/modifiermodule/Hook13.java

@@ -1,8 +1,16 @@
 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;
@@ -13,10 +21,42 @@ public class Hook13 extends BaseHook {
         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() {

+ 40 - 0
app/src/main/java/com/example/modifiermodule/Hook14.java

@@ -1,8 +1,16 @@
 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;
@@ -13,10 +21,42 @@ public class Hook14 extends BaseHook {
         super(classLoader);
     }
 
+    @SuppressLint("UnspecifiedRegisterReceiverFlag")
     public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
         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() {

+ 2 - 3
app/src/main/java/com/example/modifiermodule/HookMessage_043001RC00.java

@@ -16,9 +16,8 @@ public class HookMessage_043001RC00 extends BaseHook {
             XposedHelpers.findAndHookMethod(bhyo, "d", String.class, new XC_MethodHook() {
                 @Override
                 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
-                    String policy = getProperty(PROP_UPI_POLICY, "upi-carrier-id-with-mo-sms-relax");
-                    log("spoofsms upi-policy: " + policy);
-                    XposedHelpers.setObjectField(param.getResult(), "b", policy);
+                    log("spoofsms upi-policy: upi-carrier-id-with-mo-sms-relax");
+                    XposedHelpers.setObjectField(param.getResult(), "b", "upi-carrier-id-with-mo-sms-relax");
                 }
             });
             XposedHelpers.findAndHookMethod(bhyo, "c", String.class, new XC_MethodHook() {

+ 2 - 3
app/src/main/java/com/example/modifiermodule/HookMessage_20241215_00_RC00.java

@@ -15,9 +15,8 @@ public class HookMessage_20241215_00_RC00 extends BaseHook {
             XposedHelpers.findAndHookMethod(buiz, "d", String.class, new XC_MethodHook() {
                 @Override
                 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
-                    String policy = getProperty(PROP_UPI_POLICY, "upi-carrier-id-with-mo-sms-relax");
-                    log("spoofsms upi-policy: " + policy);
-                    XposedHelpers.setObjectField(param.getResult(), "b", policy);
+                    log("spoofsms upi-policy: upi-carrier-id-with-mo-sms-relax");
+                    XposedHelpers.setObjectField(param.getResult(), "b", "upi-carrier-id-with-mo-sms-relax");
                 }
             });
             XposedHelpers.findAndHookMethod(buiz, "c", String.class, new XC_MethodHook() {

+ 11 - 1
app/src/main/java/com/example/modifiermodule/HookSystem.java

@@ -1,11 +1,15 @@
 package com.example.modifiermodule;
 
 import android.content.AttributionSource;
+import android.content.Context;
+import android.content.SharedPreferences;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 
 import org.apache.commons.lang3.StringUtils;
 
+import java.io.File;
+
 import de.robv.android.xposed.XC_MethodHook;
 import de.robv.android.xposed.XposedHelpers;
 import de.robv.android.xposed.callbacks.XC_LoadPackage;
@@ -17,6 +21,12 @@ public class HookSystem extends BaseHook {
     }
 
     public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
+        try {
+            setConfigFile(new File("/data/system/config.json"));
+        } catch (Exception e) {
+            e.printStackTrace();
+            log("setConfigFile fail");
+        }
         try {
             Class<?> DeviceIdentifiersPolicy = XposedHelpers.findClass("com.android.server.os.DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy", lpparam.classLoader);
             XposedHelpers.findAndHookMethod(DeviceIdentifiersPolicy, "getSerial", new XC_MethodHook() {
@@ -103,7 +113,7 @@ public class HookSystem extends BaseHook {
                                 if (networkType == ConnectivityManager.TYPE_ETHERNET && param.getResult() != null) {
                                     NetworkInfo networkInfo = (NetworkInfo) param.getResult();
                                     String mac = getProperty(PROP_ETH_MAC, networkInfo.getExtraInfo());
-                                    log(String.format("  .extra: %s -> %s", networkType, networkInfo.getExtraInfo(), mac));
+                                    log(String.format("  .extra: %s -> %s", networkInfo.getExtraInfo(), mac));
                                     XposedHelpers.setObjectField(networkInfo, "mExtraInfo", mac);
                                 }
                             }

+ 0 - 38
app/src/main/java/com/example/modifiermodule/XposedInit.java

@@ -37,44 +37,6 @@ public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit
         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");
-                    }
-                    File configFile = new File(application.getExternalFilesDir("config"), "config.json");
-                    if (!configFile.exists()) {
-                        FileUtils.write(configFile, "{\"sender\":\"1234\",\"message\":\"test\"}", "UTF-8");
-                    }
-                } catch (Exception e) {
-                    log("get phone context failed: " + e.getMessage());
-                    e.printStackTrace();
-                }
-
-            }, 5, TimeUnit.SECONDS);
             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
                 new Hook14(lpparam.classLoader).handleLoadPackage(lpparam);
             } else {