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 7dfb44c8..507e2d89 100644 --- a/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java +++ b/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java @@ -26,17 +26,15 @@ import de.robv.android.xposed.XposedHelpers; public class InstallerVerifier { - public static boolean sendBinderToManager(final ClassLoader classLoader, IBinder binder) { - Utils.logI("Found LSPosed Manager"); + public static void sendBinderToManager(final ClassLoader classLoader, IBinder binder) { try { var clazz = XposedHelpers.findClass("org.lsposed.manager.Constants", classLoader); - var ret = (boolean) XposedHelpers.callStaticMethod(clazz, "setBinder", + var ok = (boolean) XposedHelpers.callStaticMethod(clazz, "setBinder", new Class[]{IBinder.class}, binder); - Utils.logI("Send binder to LSPosed Manager: " + ret); - return ret; + if (ok) return; + throw new RuntimeException("setBinder: " + false); } catch (Throwable t) { Utils.logW("Could not send binder to LSPosed Manager", t); - return false; } } } diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java index ea2d5aa2..a7cffb57 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java @@ -156,7 +156,7 @@ public class ConfigFileManager { static ParcelFileDescriptor getManagerApk() throws IOException { if (fd != null) return fd.dup(); - if (!InstallerVerifier.verifyInstallerSignature(managerApkPath.toString())) return null; + InstallerVerifier.verifyInstallerSignature(managerApkPath.toString()); SELinux.setFileContext(managerApkPath.toString(), "u:object_r:system_file:s0"); fd = ParcelFileDescriptor.open(managerApkPath.toFile(), ParcelFileDescriptor.MODE_READ_ONLY); diff --git a/daemon/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java b/daemon/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java index e174e8f7..1d6b81d1 100644 --- a/daemon/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java +++ b/daemon/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java @@ -1,29 +1,31 @@ package org.lsposed.lspd.util; +import static org.lsposed.lspd.util.SignInfo.CERTIFICATE; + import com.android.apksig.ApkVerifier; import java.io.File; +import java.io.IOException; import java.util.Arrays; -import static org.lsposed.lspd.util.SignInfo.CERTIFICATE; - public class InstallerVerifier { - public static boolean verifyInstallerSignature(String path) { + public static void verifyInstallerSignature(String path) throws IOException { ApkVerifier verifier = new ApkVerifier.Builder(new File(path)) .setMinCheckedPlatformVersion(27) .build(); try { ApkVerifier.Result result = verifier.verify(); if (!result.isVerified()) { - return false; + throw new IOException("apk signature not verified"); } - boolean ret = Arrays.equals(result.getSignerCertificates().get(0).getEncoded(), CERTIFICATE); - Utils.logI("verifyInstallerSignature: " + ret); - return ret; - } catch (Throwable t) { - Utils.logE("verifyInstallerSignature: ", t); - return false; + var mainCert = result.getSignerCertificates().get(0); + if (!Arrays.equals(mainCert.getEncoded(), CERTIFICATE)) { + var dname = mainCert.getSubjectX500Principal().getName(); + throw new IOException("apk signature mismatch: " + dname); + } + } catch (Exception t) { + throw new IOException(t); } } } diff --git a/magisk-loader/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java b/magisk-loader/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java index c7cdc566..e2d6fa93 100644 --- a/magisk-loader/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java +++ b/magisk-loader/src/main/java/org/lsposed/lspd/util/ParasiticManagerHooker.java @@ -141,7 +141,7 @@ public class ParasiticManagerHooker { } if (param.method.getName().equals("scheduleLaunchActivity")) { ActivityInfo aInfo = null; - var parameters = ((Method)param.method).getParameterTypes(); + var parameters = ((Method) param.method).getParameterTypes(); for (var i = 0; i < parameters.length; ++i) { if (parameters[i] == ActivityInfo.class) { aInfo = (ActivityInfo) param.args[i]; @@ -317,9 +317,8 @@ public class ParasiticManagerHooker { static public boolean start() { - try { - List binder = new ArrayList<>(1); - var managerParcelFd = serviceClient.requestInjectedManagerBinder(binder); + List binder = new ArrayList<>(1); + try (var managerParcelFd = serviceClient.requestInjectedManagerBinder(binder)) { if (binder.size() > 0 && binder.get(0) != null && managerParcelFd != null) { managerFd = managerParcelFd.detachFd(); var managerService = ILSPManagerService.Stub.asInterface(binder.get(0));