diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java index 9e0d200c..177a3063 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java @@ -22,7 +22,6 @@ import de.robv.android.xposed.callbacks.XC_LoadPackage; import static com.elderdrivers.riru.edxp.config.InstallerChooser.INSTALLER_PACKAGE_NAME; import static com.elderdrivers.riru.edxp.hooker.SliceProviderFix.SYSTEMUI_PACKAGE_NAME; import static com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME; -import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader; // normal process initialization (for new Activity, Service, BroadcastReceiver etc.) public class HandleBindApp extends XC_MethodHook { @@ -62,8 +61,6 @@ public class HandleBindApp extends XC_MethodHook { XposedInit.loadedPackagesInProcess.add(reportedPackageName); LoadedApk loadedApk = activityThread.getPackageInfoNoCheck(appInfo, compatInfo); - replaceParentClassLoader(loadedApk.getClassLoader()); - XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks); lpparam.packageName = reportedPackageName; lpparam.processName = (String) XposedHelpers.getObjectField(bindData, "processName"); diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/LoadedApkCstr.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/LoadedApkCstr.java index 394b0e02..889457cc 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/LoadedApkCstr.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/LoadedApkCstr.java @@ -13,8 +13,6 @@ import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.XposedInit; import de.robv.android.xposed.callbacks.XC_LoadPackage; -import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader; - // when a package is loaded for an existing process, trigger the callbacks as well // ed: remove resources related hooking public class LoadedApkCstr extends XC_MethodHook { @@ -60,8 +58,6 @@ public class LoadedApkCstr extends XC_MethodHook { return; } - replaceParentClassLoader(loadedApk.getClassLoader()); - XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks); lpparam.packageName = packageName; lpparam.processName = AndroidAppHelper.currentProcessName(); diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/StartBootstrapServices.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/StartBootstrapServices.java index 41cbfb0a..0b1b11b1 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/StartBootstrapServices.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/StartBootstrapServices.java @@ -11,7 +11,6 @@ import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.XposedInit; import de.robv.android.xposed.callbacks.XC_LoadPackage; -import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader; import static com.elderdrivers.riru.edxp.util.Utils.logD; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; @@ -28,8 +27,6 @@ public class StartBootstrapServices extends XC_MethodHook { try { XposedInit.loadedPackagesInProcess.add("android"); - replaceParentClassLoader(SystemMain.systemServerCL); - XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks); lpparam.packageName = "android"; lpparam.processName = "android"; // it's actually system_server, but other functions return this as well diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java index 51ab60c2..83550726 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java @@ -7,10 +7,12 @@ import android.text.TextUtils; import com.elderdrivers.riru.edxp._hooker.impl.HandleBindApp; import com.elderdrivers.riru.edxp._hooker.impl.LoadedApkCstr; +import com.elderdrivers.riru.edxp._hooker.impl.OneplusWorkaround; import com.elderdrivers.riru.edxp._hooker.impl.StartBootstrapServices; import com.elderdrivers.riru.edxp._hooker.impl.SystemMain; import com.elderdrivers.riru.edxp._hooker.yahfa.HandleBindAppHooker; import com.elderdrivers.riru.edxp._hooker.yahfa.LoadedApkConstructorHooker; +import com.elderdrivers.riru.edxp._hooker.yahfa.OnePlusWorkAroundHooker; import com.elderdrivers.riru.edxp._hooker.yahfa.StartBootstrapServicesHooker; import com.elderdrivers.riru.edxp._hooker.yahfa.SystemMainHooker; import com.elderdrivers.riru.edxp.core.yahfa.HookMain; @@ -138,15 +140,15 @@ public abstract class BaseRouter implements Router { public void startWorkAroundHook() { ClassLoader classLoader = BaseRouter.class.getClassLoader(); -// if (useXposedApi) { -// XposedHelpers.findAndHookMethod(OnePlusWorkAroundHooker.className, -// classLoader, OnePlusWorkAroundHooker.methodName, -// int.class, String.class, new OneplusWorkaround()); -// } else { - HookMain.doHookDefault( - BaseRouter.class.getClassLoader(), - classLoader, - WorkAroundHookInfo.class.getName()); -// } + if (useXposedApi) { + XposedHelpers.findAndHookMethod(OnePlusWorkAroundHooker.className, + classLoader, OnePlusWorkAroundHooker.methodName, + int.class, String.class, new OneplusWorkaround()); + } else { + HookMain.doHookDefault( + BaseRouter.class.getClassLoader(), + classLoader, + WorkAroundHookInfo.class.getName()); + } } } diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ClassLoaderUtils.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ClassLoaderUtils.java index 9a722e28..93133585 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ClassLoaderUtils.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ClassLoaderUtils.java @@ -10,7 +10,9 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import dalvik.system.BaseDexClassLoader; import dalvik.system.PathClassLoader; +import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; @@ -62,6 +64,11 @@ public class ClassLoaderUtils { } } + public static ClassLoader createComposeClassLoader(ClassLoader appClassLoader) { + ClassLoader current = ClassLoaderUtils.class.getClassLoader(); + return appClassLoader == null ? current : new ComposeClassLoader(appClassLoader, current); + } + public static List getAppClassLoader() { List cacheLoaders = new ArrayList<>(0); try { @@ -107,4 +114,42 @@ public class ClassLoaderUtils { return false; } + public static void hookClassLoading() { + final ClassLoader currentCl = ClassLoaderUtils.class.getClassLoader(); + XposedHelpers.findAndHookMethod(Class.class, + "forName", String.class, boolean.class, ClassLoader.class, + new XC_MethodHook(Integer.MAX_VALUE) { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + if (param.args[2] == currentCl) { + return; + } + try { + param.setResult(Class.forName( + (String) param.args[0], (boolean) param.args[1], currentCl)); + } catch (Throwable throwable) { + // silently continue to call original + } + } + }); + XC_MethodHook findClassHook = new XC_MethodHook(Integer.MAX_VALUE) { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + if (param.thisObject == currentCl) { + return; + } + try { + param.setResult(XposedHelpers.callMethod(currentCl, + "findClass", param.args[0])); + param.setThrowable(null); + } catch (Throwable throwable) { + // silently continue to return + } + } + }; + XposedHelpers.findAndHookMethod(BaseDexClassLoader.class, + "findClass", String.class, findClassHook); + XposedHelpers.findAndHookMethod("java.lang.BootClassLoader", null, + "findClass", String.class, findClassHook); + } } diff --git a/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/classloaders/ComposeClassLoader.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ComposeClassLoader.java similarity index 93% rename from edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/classloaders/ComposeClassLoader.java rename to edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ComposeClassLoader.java index 6d968f6f..1409b40b 100644 --- a/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/classloaders/ComposeClassLoader.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ComposeClassLoader.java @@ -1,4 +1,4 @@ -package com.swift.sandhook.xposedcompat.classloaders; +package com.elderdrivers.riru.edxp.util; /** * Created by weishu on 17/11/30. @@ -7,6 +7,7 @@ package com.swift.sandhook.xposedcompat.classloaders; public class ComposeClassLoader extends ClassLoader { private final ClassLoader mAppClassLoader; + public ComposeClassLoader(ClassLoader parent, ClassLoader appClassLoader) { super(parent); mAppClassLoader = appClassLoader; diff --git a/edxp-core/build.gradle b/edxp-core/build.gradle index 8d0e0578..70c5a76f 100644 --- a/edxp-core/build.gradle +++ b/edxp-core/build.gradle @@ -3,10 +3,10 @@ import org.gradle.internal.os.OperatingSystem apply plugin: 'com.android.library' -version "v0.4.3.5_alpha" +version "v0.4.3.6_alpha" ext { - versionCode = "4350" + versionCode = "4360" module_name = "EdXposed" jar_dest_dir = "${projectDir}/template_override/system/framework/" is_windows = OperatingSystem.current().isWindows() diff --git a/edxp-core/src/main/cpp/main/include/art/runtime/mirror/class.h b/edxp-core/src/main/cpp/main/include/art/runtime/mirror/class.h index cca55aca..5fcf72f3 100644 --- a/edxp-core/src/main/cpp/main/include/art/runtime/mirror/class.h +++ b/edxp-core/src/main/cpp/main/include/art/runtime/mirror/class.h @@ -1,6 +1,7 @@ #pragma once +#include #include "base/object.h" namespace art { @@ -60,6 +61,9 @@ namespace art { HOOK_FUNC(IsInSamePackage, "_ZN3art6mirror5Class15IsInSamePackageENS_6ObjPtrIS1_EE", //8.0- "_ZN3art6mirror5Class15IsInSamePackageEPS1_"); //5.0-7.1 + +// HOOK_FUNC(ClassForName, +// "_ZN3artL18Class_classForNameEP7_JNIEnvP7_jclassP8_jstringhP8_jobject"); } }; diff --git a/edxp-core/template_override/common/util_functions.sh b/edxp-core/template_override/common/util_functions.sh index 501dca39..011569a8 100644 --- a/edxp-core/template_override/common/util_functions.sh +++ b/edxp-core/template_override/common/util_functions.sh @@ -1,6 +1,6 @@ #!/system/bin/sh -EDXP_VERSION="0.4.3.5_alpha (4350)" +EDXP_VERSION="0.4.3.6_alpha (4360)" ANDROID_SDK=`getprop ro.build.version.sdk` BUILD_DESC=`getprop ro.build.description` PRODUCT=`getprop ro.build.product` diff --git a/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/XposedCompat.java b/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/XposedCompat.java index a29d621f..ed21c1bb 100644 --- a/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/XposedCompat.java +++ b/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/XposedCompat.java @@ -6,7 +6,7 @@ import android.text.TextUtils; import com.elderdrivers.riru.edxp.config.ConfigManager; import com.swift.sandhook.SandHook; -import com.swift.sandhook.xposedcompat.classloaders.ComposeClassLoader; +import com.elderdrivers.riru.edxp.util.ComposeClassLoader; import com.swift.sandhook.xposedcompat.methodgen.SandHookXposedBridge; import com.swift.sandhook.xposedcompat.utils.ApplicationUtils; import com.swift.sandhook.xposedcompat.utils.FileUtils; diff --git a/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/SandHookXposedBridge.java b/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/SandHookXposedBridge.java index 6d8cd1ec..aa30436d 100644 --- a/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/SandHookXposedBridge.java +++ b/edxp-sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/SandHookXposedBridge.java @@ -3,6 +3,7 @@ package com.swift.sandhook.xposedcompat.methodgen; import android.os.Process; import android.os.Trace; +import com.elderdrivers.riru.edxp.util.ClassLoaderUtils; import com.swift.sandhook.SandHook; import com.swift.sandhook.SandHookConfig; import com.swift.sandhook.blacklist.HookBlackList; @@ -31,7 +32,7 @@ public final class SandHookXposedBridge { private static final AtomicBoolean dexPathInited = new AtomicBoolean(false); private static File dexDir; - public static Map entityMap = new ConcurrentHashMap<>(); + public static Map entityMap = new ConcurrentHashMap<>(); public static boolean hooked(Member member) { return hookedInfo.containsKey(member) || entityMap.containsKey(member); @@ -76,7 +77,9 @@ public final class SandHookXposedBridge { hookMaker = defaultHookMaker; } hookMaker.start(hookMethod, additionalHookInfo, - hookMethod.getDeclaringClass().getClassLoader(), dexDir == null ? null : dexDir.getAbsolutePath()); + ClassLoaderUtils.createComposeClassLoader( + hookMethod.getDeclaringClass().getClassLoader()), + dexDir == null ? null : dexDir.getAbsolutePath()); hookedInfo.put(hookMethod, hookMaker.getCallBackupMethod()); } DexLog.d("hook method <" + hookMethod.toString() + "> cost " + (System.currentTimeMillis() - timeStart) + " ms, by " + (stub != null ? "internal stub" : "dex maker")); diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/dexmaker/HookerDexMaker.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/dexmaker/HookerDexMaker.java index e0f1a42b..421b4051 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/dexmaker/HookerDexMaker.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/dexmaker/HookerDexMaker.java @@ -6,6 +6,7 @@ import android.text.TextUtils; import com.elderdrivers.riru.edxp.core.Yahfa; import com.elderdrivers.riru.edxp.core.yahfa.HookMain; +import com.elderdrivers.riru.edxp.util.ComposeClassLoader; import java.io.File; import java.lang.reflect.Constructor; @@ -177,9 +178,10 @@ public class HookerDexMaker { mDexDirPath = dexDirPath; if (appClassLoader == null || appClassLoader.getClass().getName().equals("java.lang.BootClassLoader")) { - mAppClassLoader = this.getClass().getClassLoader(); + mAppClassLoader = getClass().getClassLoader(); } else { mAppClassLoader = appClassLoader; + mAppClassLoader = new ComposeClassLoader(mAppClassLoader, getClass().getClassLoader()); } doMake(); }