From ba701b0435563bf67c073b571ce3953e54e91cba Mon Sep 17 00:00:00 2001 From: vvb2060 Date: Thu, 12 Aug 2021 02:12:51 +0800 Subject: [PATCH] Check old version Manager (#886) --- .../java/org/lsposed/manager/Constants.java | 3 ++- .../lspd/hooker/LoadedApkGetCLHooker.java | 5 +++-- .../lsposed/lspd/util/InstallerVerifier.java | 20 +++++++++---------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/Constants.java b/app/src/main/java/org/lsposed/manager/Constants.java index db7e61fd..7b812e33 100644 --- a/app/src/main/java/org/lsposed/manager/Constants.java +++ b/app/src/main/java/org/lsposed/manager/Constants.java @@ -31,7 +31,8 @@ public class Constants { Toast.makeText(App.getInstance(), R.string.app_destroyed, Toast.LENGTH_LONG).show(); } - public static void setBinder(IBinder binder) { + public static boolean setBinder(IBinder binder) { LSPManagerServiceHolder.init(binder); + return LSPManagerServiceHolder.getService().asBinder().isBinderAlive(); } } diff --git a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java index f71e2da7..2ac43c34 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java @@ -100,9 +100,10 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { blocked = serviceClient.requestManagerBinder(packageName, path, binder); } if (binder.size() != 0 && binder.get(0) != null) { - InstallerVerifier.hookXposedInstaller(lpparam.classLoader, binder.get(0)); + var ret = InstallerVerifier.sendBinderToManager(lpparam.classLoader, binder.get(0)); + if (!ret) InstallerVerifier.hookBadManager(classLoader); } else if (blocked) { - InstallerVerifier.hookXposedInstaller(classLoader); + InstallerVerifier.hookBadManager(classLoader); } else { XC_LoadPackage.callAll(lpparam); } diff --git a/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java b/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java index 9e68bb1d..34971a90 100644 --- a/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java +++ b/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java @@ -23,7 +23,6 @@ package org.lsposed.lspd.util; import static org.lsposed.lspd.util.SignInfo.CERTIFICATE; import android.content.Context; -import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -31,8 +30,6 @@ import android.widget.Toast; import com.android.apksig.ApkVerifier; -import org.lsposed.lspd.service.ServiceManager; - import java.io.File; import java.util.Arrays; @@ -56,7 +53,7 @@ public class InstallerVerifier { } } - public static void hookXposedInstaller(final ClassLoader classLoader) { + public static void hookBadManager(final ClassLoader classLoader) { try { Class ConstantsClass = XposedHelpers.findClass("org.lsposed.manager.Constants", classLoader); XposedHelpers.findAndHookMethod(android.app.Activity.class, "onCreate", Bundle.class, new XC_MethodHook() { @@ -72,18 +69,21 @@ public class InstallerVerifier { } }); } catch (Throwable t) { - Utils.logW("hookXposedInstaller: ", t); + Utils.logW("hookBadManager: ", t); } } - public static void hookXposedInstaller(final ClassLoader classLoader, IBinder binder) { - Utils.logI("Found LSPosed Manager, hooking it"); + public static boolean sendBinderToManager(final ClassLoader classLoader, IBinder binder) { + Utils.logI("Found LSPosed Manager"); try { var clazz = XposedHelpers.findClass("org.lsposed.manager.Constants", classLoader); - XposedHelpers.callStaticMethod(clazz, "setBinder", new Class[]{IBinder.class}, binder); - Utils.logI("Hooked LSPosed Manager"); + var ret = (boolean) XposedHelpers.callStaticMethod(clazz, "setBinder", + new Class[]{IBinder.class}, binder); + Utils.logI("Send binder to LSPosed Manager: " + ret); + return ret; } catch (Throwable t) { - Utils.logW("Could not hook LSPosed Manager", t); + Utils.logW("Could not send binder to LSPosed Manager", t); + return false; } } }