ElderDrivers / EdXposed

Elder driver Xposed Framework.
https://edxp.meowcat.org/
GNU General Public License v3.0
5.37k stars 621 forks source link

[BUG] [HELP NEEDED] Not Hooking correctly on Android 11 Samsung One UI 3.0 #835

Open NULL0B opened 3 years ago

NULL0B commented 3 years ago

Hi Im using Android 11 One UI 3.0. Magisk 21.4 Riru v23.5 and EdXposed-v0.5.2.2_4683-master-release.zip

Consider the following snnipet That works only if the Dummy line is pressent (it has to be edxposed api call) . I have no errors in logs also only "hooking success". i got the same behavior in both variants snadhook and yahfa.

   if (loadPackageParam.packageName.equals("android")) {

           Class findClass = XposedHelpers.findClass("com.android.server.power.ShutdownThread", classLoader);
//THE FOLLOWING IS A DUMMY LINE WHITOUT IT THE HOOK DOES NOT WORK            
XposedHelpers.getStaticObjectField(findClass, "mReason");
                XposedBridge.hookAllMethods(findClass, "reboot", new XC_MethodHook() {
                          public void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) {
                        XposedBridge.log("FFK: before reboot ");
                        String str = (String) methodHookParam.args[1];
                        XposedBridge.log("FFK: reason = " + str);
                        if (str.equals("userrequested")) {
                            XposedBridge.log("FFK: Changing reason to recovery");
                            methodHookParam.args[1] = "recovery";
                        }
                    }
                });
            }
 }
MlgmXyysd commented 3 years ago

Test success in OnePlus 8T Hydrogen OS 11 Android 11, Magisk 21.4, Riru 23.4, EdXposed 0.5.2.2_4683 (YAHFA). It can work without XposedHelpers.getStaticObjectField(findClass, "mReason");.

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
        if (lpparam.packageName.equals("android")) {
            Class<?> findClass = XposedHelpers.findClass("com.android.server.power.ShutdownThread", lpparam.classLoader);
            // Both findAndHookMethod and hookAllMethods work
            // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java;l=232
            // XposedHelpers.findAndHookMethod(findClass, "reboot", Context.class, String.class, boolean.class, new XC_MethodHook() {
            XposedBridge.hookAllMethods(findClass, "reboot", new XC_MethodHook() {
                public void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) {
                    XposedBridge.log("FFK: before reboot ");
                    String str = (String) methodHookParam.args[1];
                    XposedBridge.log("FFK: reason = " + str);
                    if (str.equals("userrequested")) {
                        XposedBridge.log("FFK: Changing reason to recovery");
                        methodHookParam.args[1] = "recovery";
                    }
                    // Test for prevents reboot
                    methodHookParam.setResult(false);
                }
            });
        }
    }

Result:

02-25 12:10:50.998 1725 1735 I EdXposed-Bridge: FFK: brfore reboot
02-25 12:10:50.998 1725 1735 I EdXposed-Bridge: FFK: reason = userrequested
02-25 12:10:50.998 1725 1735 I EdXposed-Bridge: FFK: Changing reason to recovery

The restart request is then blocked.

There is only one method with the reboot name in the source code.

I prefer to think that it is a ROM problem. It is recommended to check whether ROM has modified the related methods.