Use ComposeClassLoader

This commit is contained in:
solohsu 2019-06-06 11:39:28 +08:00
parent 74144b8f1a
commit fe10afb663
12 changed files with 75 additions and 28 deletions

View File

@ -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.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
import static com.elderdrivers.riru.edxp.hooker.SliceProviderFix.SYSTEMUI_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.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader;
// normal process initialization (for new Activity, Service, BroadcastReceiver etc.) // normal process initialization (for new Activity, Service, BroadcastReceiver etc.)
public class HandleBindApp extends XC_MethodHook { public class HandleBindApp extends XC_MethodHook {
@ -62,8 +61,6 @@ public class HandleBindApp extends XC_MethodHook {
XposedInit.loadedPackagesInProcess.add(reportedPackageName); XposedInit.loadedPackagesInProcess.add(reportedPackageName);
LoadedApk loadedApk = activityThread.getPackageInfoNoCheck(appInfo, compatInfo); LoadedApk loadedApk = activityThread.getPackageInfoNoCheck(appInfo, compatInfo);
replaceParentClassLoader(loadedApk.getClassLoader());
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks); XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
lpparam.packageName = reportedPackageName; lpparam.packageName = reportedPackageName;
lpparam.processName = (String) XposedHelpers.getObjectField(bindData, "processName"); lpparam.processName = (String) XposedHelpers.getObjectField(bindData, "processName");

View File

@ -13,8 +13,6 @@ import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.XposedInit; import de.robv.android.xposed.XposedInit;
import de.robv.android.xposed.callbacks.XC_LoadPackage; 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 // when a package is loaded for an existing process, trigger the callbacks as well
// ed: remove resources related hooking // ed: remove resources related hooking
public class LoadedApkCstr extends XC_MethodHook { public class LoadedApkCstr extends XC_MethodHook {
@ -60,8 +58,6 @@ public class LoadedApkCstr extends XC_MethodHook {
return; return;
} }
replaceParentClassLoader(loadedApk.getClassLoader());
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks); XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
lpparam.packageName = packageName; lpparam.packageName = packageName;
lpparam.processName = AndroidAppHelper.currentProcessName(); lpparam.processName = AndroidAppHelper.currentProcessName();

View File

@ -11,7 +11,6 @@ import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.XposedInit; import de.robv.android.xposed.XposedInit;
import de.robv.android.xposed.callbacks.XC_LoadPackage; 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 com.elderdrivers.riru.edxp.util.Utils.logD;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
@ -28,8 +27,6 @@ public class StartBootstrapServices extends XC_MethodHook {
try { try {
XposedInit.loadedPackagesInProcess.add("android"); XposedInit.loadedPackagesInProcess.add("android");
replaceParentClassLoader(SystemMain.systemServerCL);
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks); XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
lpparam.packageName = "android"; lpparam.packageName = "android";
lpparam.processName = "android"; // it's actually system_server, but other functions return this as well lpparam.processName = "android"; // it's actually system_server, but other functions return this as well

View File

@ -7,10 +7,12 @@ import android.text.TextUtils;
import com.elderdrivers.riru.edxp._hooker.impl.HandleBindApp; import com.elderdrivers.riru.edxp._hooker.impl.HandleBindApp;
import com.elderdrivers.riru.edxp._hooker.impl.LoadedApkCstr; 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.StartBootstrapServices;
import com.elderdrivers.riru.edxp._hooker.impl.SystemMain; import com.elderdrivers.riru.edxp._hooker.impl.SystemMain;
import com.elderdrivers.riru.edxp._hooker.yahfa.HandleBindAppHooker; import com.elderdrivers.riru.edxp._hooker.yahfa.HandleBindAppHooker;
import com.elderdrivers.riru.edxp._hooker.yahfa.LoadedApkConstructorHooker; 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.StartBootstrapServicesHooker;
import com.elderdrivers.riru.edxp._hooker.yahfa.SystemMainHooker; import com.elderdrivers.riru.edxp._hooker.yahfa.SystemMainHooker;
import com.elderdrivers.riru.edxp.core.yahfa.HookMain; import com.elderdrivers.riru.edxp.core.yahfa.HookMain;
@ -138,15 +140,15 @@ public abstract class BaseRouter implements Router {
public void startWorkAroundHook() { public void startWorkAroundHook() {
ClassLoader classLoader = BaseRouter.class.getClassLoader(); ClassLoader classLoader = BaseRouter.class.getClassLoader();
// if (useXposedApi) { if (useXposedApi) {
// XposedHelpers.findAndHookMethod(OnePlusWorkAroundHooker.className, XposedHelpers.findAndHookMethod(OnePlusWorkAroundHooker.className,
// classLoader, OnePlusWorkAroundHooker.methodName, classLoader, OnePlusWorkAroundHooker.methodName,
// int.class, String.class, new OneplusWorkaround()); int.class, String.class, new OneplusWorkaround());
// } else { } else {
HookMain.doHookDefault( HookMain.doHookDefault(
BaseRouter.class.getClassLoader(), BaseRouter.class.getClassLoader(),
classLoader, classLoader,
WorkAroundHookInfo.class.getName()); WorkAroundHookInfo.class.getName());
// } }
} }
} }

View File

@ -10,7 +10,9 @@ import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import dalvik.system.BaseDexClassLoader;
import dalvik.system.PathClassLoader; import dalvik.system.PathClassLoader;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers; 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<ClassLoader> getAppClassLoader() { public static List<ClassLoader> getAppClassLoader() {
List<ClassLoader> cacheLoaders = new ArrayList<>(0); List<ClassLoader> cacheLoaders = new ArrayList<>(0);
try { try {
@ -107,4 +114,42 @@ public class ClassLoaderUtils {
return false; 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);
}
} }

View File

@ -1,4 +1,4 @@
package com.swift.sandhook.xposedcompat.classloaders; package com.elderdrivers.riru.edxp.util;
/** /**
* Created by weishu on 17/11/30. * Created by weishu on 17/11/30.
@ -7,6 +7,7 @@ package com.swift.sandhook.xposedcompat.classloaders;
public class ComposeClassLoader extends ClassLoader { public class ComposeClassLoader extends ClassLoader {
private final ClassLoader mAppClassLoader; private final ClassLoader mAppClassLoader;
public ComposeClassLoader(ClassLoader parent, ClassLoader appClassLoader) { public ComposeClassLoader(ClassLoader parent, ClassLoader appClassLoader) {
super(parent); super(parent);
mAppClassLoader = appClassLoader; mAppClassLoader = appClassLoader;

View File

@ -3,10 +3,10 @@ import org.gradle.internal.os.OperatingSystem
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
version "v0.4.3.5_alpha" version "v0.4.3.6_alpha"
ext { ext {
versionCode = "4350" versionCode = "4360"
module_name = "EdXposed" module_name = "EdXposed"
jar_dest_dir = "${projectDir}/template_override/system/framework/" jar_dest_dir = "${projectDir}/template_override/system/framework/"
is_windows = OperatingSystem.current().isWindows() is_windows = OperatingSystem.current().isWindows()

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <edxp_context.h>
#include "base/object.h" #include "base/object.h"
namespace art { namespace art {
@ -60,6 +61,9 @@ namespace art {
HOOK_FUNC(IsInSamePackage, HOOK_FUNC(IsInSamePackage,
"_ZN3art6mirror5Class15IsInSamePackageENS_6ObjPtrIS1_EE", //8.0- "_ZN3art6mirror5Class15IsInSamePackageENS_6ObjPtrIS1_EE", //8.0-
"_ZN3art6mirror5Class15IsInSamePackageEPS1_"); //5.0-7.1 "_ZN3art6mirror5Class15IsInSamePackageEPS1_"); //5.0-7.1
// HOOK_FUNC(ClassForName,
// "_ZN3artL18Class_classForNameEP7_JNIEnvP7_jclassP8_jstringhP8_jobject");
} }
}; };

View File

@ -1,6 +1,6 @@
#!/system/bin/sh #!/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` ANDROID_SDK=`getprop ro.build.version.sdk`
BUILD_DESC=`getprop ro.build.description` BUILD_DESC=`getprop ro.build.description`
PRODUCT=`getprop ro.build.product` PRODUCT=`getprop ro.build.product`

View File

@ -6,7 +6,7 @@ import android.text.TextUtils;
import com.elderdrivers.riru.edxp.config.ConfigManager; import com.elderdrivers.riru.edxp.config.ConfigManager;
import com.swift.sandhook.SandHook; 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.methodgen.SandHookXposedBridge;
import com.swift.sandhook.xposedcompat.utils.ApplicationUtils; import com.swift.sandhook.xposedcompat.utils.ApplicationUtils;
import com.swift.sandhook.xposedcompat.utils.FileUtils; import com.swift.sandhook.xposedcompat.utils.FileUtils;

View File

@ -3,6 +3,7 @@ package com.swift.sandhook.xposedcompat.methodgen;
import android.os.Process; import android.os.Process;
import android.os.Trace; import android.os.Trace;
import com.elderdrivers.riru.edxp.util.ClassLoaderUtils;
import com.swift.sandhook.SandHook; import com.swift.sandhook.SandHook;
import com.swift.sandhook.SandHookConfig; import com.swift.sandhook.SandHookConfig;
import com.swift.sandhook.blacklist.HookBlackList; import com.swift.sandhook.blacklist.HookBlackList;
@ -76,7 +77,9 @@ public final class SandHookXposedBridge {
hookMaker = defaultHookMaker; hookMaker = defaultHookMaker;
} }
hookMaker.start(hookMethod, additionalHookInfo, 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()); hookedInfo.put(hookMethod, hookMaker.getCallBackupMethod());
} }
DexLog.d("hook method <" + hookMethod.toString() + "> cost " + (System.currentTimeMillis() - timeStart) + " ms, by " + (stub != null ? "internal stub" : "dex maker")); DexLog.d("hook method <" + hookMethod.toString() + "> cost " + (System.currentTimeMillis() - timeStart) + " ms, by " + (stub != null ? "internal stub" : "dex maker"));

View File

@ -6,6 +6,7 @@ import android.text.TextUtils;
import com.elderdrivers.riru.edxp.core.Yahfa; import com.elderdrivers.riru.edxp.core.Yahfa;
import com.elderdrivers.riru.edxp.core.yahfa.HookMain; import com.elderdrivers.riru.edxp.core.yahfa.HookMain;
import com.elderdrivers.riru.edxp.util.ComposeClassLoader;
import java.io.File; import java.io.File;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
@ -177,9 +178,10 @@ public class HookerDexMaker {
mDexDirPath = dexDirPath; mDexDirPath = dexDirPath;
if (appClassLoader == null if (appClassLoader == null
|| appClassLoader.getClass().getName().equals("java.lang.BootClassLoader")) { || appClassLoader.getClass().getName().equals("java.lang.BootClassLoader")) {
mAppClassLoader = this.getClass().getClassLoader(); mAppClassLoader = getClass().getClassLoader();
} else { } else {
mAppClassLoader = appClassLoader; mAppClassLoader = appClassLoader;
mAppClassLoader = new ComposeClassLoader(mAppClassLoader, getClass().getClassLoader());
} }
doMake(); doMake();
} }