Add Xposed API implementation for bootstrap hooks
This commit is contained in:
parent
c38affbf3a
commit
e7cdc25ab1
|
|
@ -1,18 +1,28 @@
|
|||
package com.elderdrivers.riru.edxp.proxy;
|
||||
|
||||
import android.app.ActivityThread;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.res.CompatibilityInfo;
|
||||
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.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.StartBootstrapServicesHooker;
|
||||
import com.elderdrivers.riru.edxp._hooker.yahfa.SystemMainHooker;
|
||||
import com.elderdrivers.riru.edxp.core.yahfa.HookMain;
|
||||
import com.elderdrivers.riru.edxp.entry.yahfa.AppBootstrapHookInfo;
|
||||
import com.elderdrivers.riru.edxp.entry.yahfa.SysBootstrapHookInfo;
|
||||
import com.elderdrivers.riru.edxp.entry.yahfa.SysInnerHookInfo;
|
||||
import com.elderdrivers.riru.edxp.entry.yahfa.WorkAroundHookInfo;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
import de.robv.android.xposed.XposedInit;
|
||||
|
||||
public abstract class BaseRouter implements Router {
|
||||
|
|
@ -21,6 +31,8 @@ public abstract class BaseRouter implements Router {
|
|||
|
||||
protected volatile AtomicBoolean bootstrapHooked = new AtomicBoolean(false);
|
||||
|
||||
protected static boolean useXposedApi = false;
|
||||
|
||||
public void initResourcesHook() {
|
||||
startWorkAroundHook(); // for OnePlus devices
|
||||
XposedBridge.initXResources();
|
||||
|
|
@ -80,31 +92,59 @@ public abstract class BaseRouter implements Router {
|
|||
|
||||
public void startBootstrapHook(boolean isSystem) {
|
||||
Utils.logD("startBootstrapHook starts: isSystem = " + isSystem);
|
||||
ClassLoader classLoader = XposedBridge.BOOTCLASSLOADER;
|
||||
if (isSystem) {
|
||||
HookMain.doHookDefault(
|
||||
BaseRouter.class.getClassLoader(),
|
||||
classLoader,
|
||||
SysBootstrapHookInfo.class.getName());
|
||||
ClassLoader classLoader = BaseRouter.class.getClassLoader();
|
||||
if (useXposedApi) {
|
||||
if (isSystem) {
|
||||
XposedHelpers.findAndHookMethod(SystemMainHooker.className, classLoader,
|
||||
SystemMainHooker.methodName, new SystemMain());
|
||||
}
|
||||
XposedHelpers.findAndHookMethod(HandleBindAppHooker.className, classLoader,
|
||||
HandleBindAppHooker.methodName,
|
||||
"android.app.ActivityThread$AppBindData",
|
||||
new HandleBindApp());
|
||||
XposedHelpers.findAndHookConstructor(LoadedApkConstructorHooker.className, classLoader,
|
||||
ActivityThread.class, ApplicationInfo.class, CompatibilityInfo.class,
|
||||
ClassLoader.class, boolean.class, boolean.class, boolean.class,
|
||||
new LoadedApkCstr());
|
||||
} else {
|
||||
HookMain.doHookDefault(
|
||||
BaseRouter.class.getClassLoader(),
|
||||
classLoader,
|
||||
AppBootstrapHookInfo.class.getName());
|
||||
if (isSystem) {
|
||||
HookMain.doHookDefault(
|
||||
BaseRouter.class.getClassLoader(),
|
||||
classLoader,
|
||||
SysBootstrapHookInfo.class.getName());
|
||||
} else {
|
||||
HookMain.doHookDefault(
|
||||
BaseRouter.class.getClassLoader(),
|
||||
classLoader,
|
||||
AppBootstrapHookInfo.class.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void startSystemServerHook() {
|
||||
HookMain.doHookDefault(
|
||||
BaseRouter.class.getClassLoader(),
|
||||
SystemMainHooker.systemServerCL,
|
||||
SysInnerHookInfo.class.getName());
|
||||
ClassLoader classLoader = BaseRouter.class.getClassLoader();
|
||||
if (useXposedApi) {
|
||||
XposedHelpers.findAndHookMethod(StartBootstrapServicesHooker.className, classLoader,
|
||||
StartBootstrapServicesHooker.methodName, new StartBootstrapServices());
|
||||
} else {
|
||||
HookMain.doHookDefault(
|
||||
classLoader,
|
||||
SystemMainHooker.systemServerCL,
|
||||
SystemMainHooker.class.getName());
|
||||
}
|
||||
}
|
||||
|
||||
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(),
|
||||
XposedBridge.BOOTCLASSLOADER,
|
||||
classLoader,
|
||||
WorkAroundHookInfo.class.getName());
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -203,6 +203,7 @@ static void ensureMethodCached(void *hookMethod, void *backupMethod,
|
|||
int methodIndex = read32(
|
||||
(void *) ((char *) backupMethod + OFFSET_dex_method_index_in_ArtMethod));
|
||||
|
||||
// todo fixme
|
||||
if (methodIndex >= 512) {
|
||||
LOGW("methodIndex = %d", methodIndex);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.elderdrivers.riru.edxp.sandhook.core;
|
|||
|
||||
import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal;
|
||||
import com.elderdrivers.riru.edxp.proxy.BaseRouter;
|
||||
import com.elderdrivers.riru.edxp.sandhook.hooker.SystemMainHooker;
|
||||
import com.elderdrivers.riru.edxp.sandhook.config.SandHookEdxpConfig;
|
||||
import com.elderdrivers.riru.edxp.sandhook.config.SandHookProvider;
|
||||
import com.elderdrivers.riru.edxp.sandhook.dexmaker.DynamicBridge;
|
||||
|
|
@ -10,6 +9,7 @@ import com.elderdrivers.riru.edxp.sandhook.entry.AppBootstrapHookInfo;
|
|||
import com.elderdrivers.riru.edxp.sandhook.entry.SysBootstrapHookInfo;
|
||||
import com.elderdrivers.riru.edxp.sandhook.entry.SysInnerHookInfo;
|
||||
import com.elderdrivers.riru.edxp.sandhook.entry.WorkAroundHookInfo;
|
||||
import com.elderdrivers.riru.edxp.sandhook.hooker.SystemMainHooker;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
import com.swift.sandhook.xposedcompat.XposedCompat;
|
||||
|
||||
|
|
@ -17,6 +17,10 @@ import de.robv.android.xposed.XposedBridge;
|
|||
|
||||
public class SandHookRouter extends BaseRouter {
|
||||
|
||||
public SandHookRouter() {
|
||||
useXposedApi = true;
|
||||
}
|
||||
|
||||
private static boolean useSandHook = false;
|
||||
|
||||
public void startBootstrapHook(boolean isSystem) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue