From e7cdc25ab19de1a4c28173f8c75d156a8effc282 Mon Sep 17 00:00:00 2001 From: solohsu Date: Tue, 4 Jun 2019 17:51:25 +0800 Subject: [PATCH] Add Xposed API implementation for bootstrap hooks --- .../riru/edxp/proxy/BaseRouter.java | 72 ++++++++++++++----- .../main/cpp/external/yahfa/src/HookMain.c | 1 + .../edxp/sandhook/core/SandHookRouter.java | 6 +- 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java index c50a8c68..ab337dd8 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java @@ -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()); +// } } } diff --git a/edxp-core/src/main/cpp/external/yahfa/src/HookMain.c b/edxp-core/src/main/cpp/external/yahfa/src/HookMain.c index a3c522ab..c15a5687 100644 --- a/edxp-core/src/main/cpp/external/yahfa/src/HookMain.c +++ b/edxp-core/src/main/cpp/external/yahfa/src/HookMain.c @@ -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); } diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/core/SandHookRouter.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/core/SandHookRouter.java index ae0ac965..3710353c 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/core/SandHookRouter.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/core/SandHookRouter.java @@ -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) {