Add Xposed API implementation for bootstrap hooks

This commit is contained in:
solohsu 2019-06-04 17:51:25 +08:00
parent c38affbf3a
commit e7cdc25ab1
3 changed files with 62 additions and 17 deletions

View File

@ -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());
// }
}
}

View File

@ -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);
}

View File

@ -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) {