Use ComposeClassLoader
This commit is contained in:
parent
74144b8f1a
commit
fe10afb663
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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`
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -31,7 +32,7 @@ public final class SandHookXposedBridge {
|
||||||
private static final AtomicBoolean dexPathInited = new AtomicBoolean(false);
|
private static final AtomicBoolean dexPathInited = new AtomicBoolean(false);
|
||||||
private static File dexDir;
|
private static File dexDir;
|
||||||
|
|
||||||
public static Map<Member,HookMethodEntity> entityMap = new ConcurrentHashMap<>();
|
public static Map<Member, HookMethodEntity> entityMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public static boolean hooked(Member member) {
|
public static boolean hooked(Member member) {
|
||||||
return hookedInfo.containsKey(member) || entityMap.containsKey(member);
|
return hookedInfo.containsKey(member) || entityMap.containsKey(member);
|
||||||
|
|
@ -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"));
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue