From a3381da7ed845a718c2e25955774b3f83063cd83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=8B=E9=A1=B5?= <31466456+canyie@users.noreply.github.com> Date: Sat, 4 Jun 2022 19:21:57 +0800 Subject: [PATCH] Bypass DexFile's security check for RootService (#5911) Old Android (pre 8.0) enforces `optimizedDirectory` to have the same uid with the process. If repackaged, root service (uid=0) will crash when trying to load current.apk. So we set `optimizedDirectory` to null to bypass the check. --- .../com/topjohnwu/magisk/utils/DynamicClassLoader.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/shared/src/main/java/com/topjohnwu/magisk/utils/DynamicClassLoader.java b/app/shared/src/main/java/com/topjohnwu/magisk/utils/DynamicClassLoader.java index 3bc92a6c1..71b61f475 100644 --- a/app/shared/src/main/java/com/topjohnwu/magisk/utils/DynamicClassLoader.java +++ b/app/shared/src/main/java/com/topjohnwu/magisk/utils/DynamicClassLoader.java @@ -5,18 +5,19 @@ import java.io.IOException; import java.net.URL; import java.util.Enumeration; -import dalvik.system.DexClassLoader; +import dalvik.system.BaseDexClassLoader; -public class DynamicClassLoader extends DexClassLoader { +public class DynamicClassLoader extends BaseDexClassLoader { private static final ClassLoader base = Object.class.getClassLoader(); public DynamicClassLoader(File apk) { - super(apk.getPath(), apk.getParent(), null, base); + this(apk, base); } public DynamicClassLoader(File apk, ClassLoader parent) { - super(apk.getPath(), apk.getParent(), null, parent); + // Set optimizedDirectory to null to bypass DexFile's security checks + super(apk.getPath(), null, null, parent); } @Override