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;
|
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 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._hooker.yahfa.SystemMainHooker;
|
||||||
import com.elderdrivers.riru.edxp.core.yahfa.HookMain;
|
import com.elderdrivers.riru.edxp.core.yahfa.HookMain;
|
||||||
import com.elderdrivers.riru.edxp.entry.yahfa.AppBootstrapHookInfo;
|
import com.elderdrivers.riru.edxp.entry.yahfa.AppBootstrapHookInfo;
|
||||||
import com.elderdrivers.riru.edxp.entry.yahfa.SysBootstrapHookInfo;
|
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.entry.yahfa.WorkAroundHookInfo;
|
||||||
import com.elderdrivers.riru.edxp.util.Utils;
|
import com.elderdrivers.riru.edxp.util.Utils;
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
import de.robv.android.xposed.XposedInit;
|
import de.robv.android.xposed.XposedInit;
|
||||||
|
|
||||||
public abstract class BaseRouter implements Router {
|
public abstract class BaseRouter implements Router {
|
||||||
|
|
@ -21,6 +31,8 @@ public abstract class BaseRouter implements Router {
|
||||||
|
|
||||||
protected volatile AtomicBoolean bootstrapHooked = new AtomicBoolean(false);
|
protected volatile AtomicBoolean bootstrapHooked = new AtomicBoolean(false);
|
||||||
|
|
||||||
|
protected static boolean useXposedApi = false;
|
||||||
|
|
||||||
public void initResourcesHook() {
|
public void initResourcesHook() {
|
||||||
startWorkAroundHook(); // for OnePlus devices
|
startWorkAroundHook(); // for OnePlus devices
|
||||||
XposedBridge.initXResources();
|
XposedBridge.initXResources();
|
||||||
|
|
@ -80,7 +92,21 @@ public abstract class BaseRouter implements Router {
|
||||||
|
|
||||||
public void startBootstrapHook(boolean isSystem) {
|
public void startBootstrapHook(boolean isSystem) {
|
||||||
Utils.logD("startBootstrapHook starts: isSystem = " + isSystem);
|
Utils.logD("startBootstrapHook starts: isSystem = " + isSystem);
|
||||||
ClassLoader classLoader = XposedBridge.BOOTCLASSLOADER;
|
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 {
|
||||||
if (isSystem) {
|
if (isSystem) {
|
||||||
HookMain.doHookDefault(
|
HookMain.doHookDefault(
|
||||||
BaseRouter.class.getClassLoader(),
|
BaseRouter.class.getClassLoader(),
|
||||||
|
|
@ -93,18 +119,32 @@ public abstract class BaseRouter implements Router {
|
||||||
AppBootstrapHookInfo.class.getName());
|
AppBootstrapHookInfo.class.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void startSystemServerHook() {
|
public void startSystemServerHook() {
|
||||||
|
ClassLoader classLoader = BaseRouter.class.getClassLoader();
|
||||||
|
if (useXposedApi) {
|
||||||
|
XposedHelpers.findAndHookMethod(StartBootstrapServicesHooker.className, classLoader,
|
||||||
|
StartBootstrapServicesHooker.methodName, new StartBootstrapServices());
|
||||||
|
} else {
|
||||||
HookMain.doHookDefault(
|
HookMain.doHookDefault(
|
||||||
BaseRouter.class.getClassLoader(),
|
classLoader,
|
||||||
SystemMainHooker.systemServerCL,
|
SystemMainHooker.systemServerCL,
|
||||||
SysInnerHookInfo.class.getName());
|
SystemMainHooker.class.getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startWorkAroundHook() {
|
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(
|
HookMain.doHookDefault(
|
||||||
BaseRouter.class.getClassLoader(),
|
BaseRouter.class.getClassLoader(),
|
||||||
XposedBridge.BOOTCLASSLOADER,
|
classLoader,
|
||||||
WorkAroundHookInfo.class.getName());
|
WorkAroundHookInfo.class.getName());
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -203,6 +203,7 @@ static void ensureMethodCached(void *hookMethod, void *backupMethod,
|
||||||
int methodIndex = read32(
|
int methodIndex = read32(
|
||||||
(void *) ((char *) backupMethod + OFFSET_dex_method_index_in_ArtMethod));
|
(void *) ((char *) backupMethod + OFFSET_dex_method_index_in_ArtMethod));
|
||||||
|
|
||||||
|
// todo fixme
|
||||||
if (methodIndex >= 512) {
|
if (methodIndex >= 512) {
|
||||||
LOGW("methodIndex = %d", methodIndex);
|
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.config.EdXpConfigGlobal;
|
||||||
import com.elderdrivers.riru.edxp.proxy.BaseRouter;
|
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.SandHookEdxpConfig;
|
||||||
import com.elderdrivers.riru.edxp.sandhook.config.SandHookProvider;
|
import com.elderdrivers.riru.edxp.sandhook.config.SandHookProvider;
|
||||||
import com.elderdrivers.riru.edxp.sandhook.dexmaker.DynamicBridge;
|
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.SysBootstrapHookInfo;
|
||||||
import com.elderdrivers.riru.edxp.sandhook.entry.SysInnerHookInfo;
|
import com.elderdrivers.riru.edxp.sandhook.entry.SysInnerHookInfo;
|
||||||
import com.elderdrivers.riru.edxp.sandhook.entry.WorkAroundHookInfo;
|
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.elderdrivers.riru.edxp.util.Utils;
|
||||||
import com.swift.sandhook.xposedcompat.XposedCompat;
|
import com.swift.sandhook.xposedcompat.XposedCompat;
|
||||||
|
|
||||||
|
|
@ -17,6 +17,10 @@ import de.robv.android.xposed.XposedBridge;
|
||||||
|
|
||||||
public class SandHookRouter extends BaseRouter {
|
public class SandHookRouter extends BaseRouter {
|
||||||
|
|
||||||
|
public SandHookRouter() {
|
||||||
|
useXposedApi = true;
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean useSandHook = false;
|
private static boolean useSandHook = false;
|
||||||
|
|
||||||
public void startBootstrapHook(boolean isSystem) {
|
public void startBootstrapHook(boolean isSystem) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue