From 5cba146185d109646a3f6f8241e8583c4b191a33 Mon Sep 17 00:00:00 2001 From: solohsu Date: Mon, 17 Jun 2019 22:45:01 +0800 Subject: [PATCH] Whale: fix bootloop --- .../riru/edxp/util/ClassUtils.java | 12 +++++++++++ .../src/main/cpp/main/src/edxp_context.cpp | 11 +++++++++- .../src/main/cpp/main/src/edxp_context.h | 5 ++++- .../edxp/whale/config/WhaleEdxpConfig.java | 2 +- .../edxp/whale/config/WhaleHookProvider.java | 9 ++++++-- .../riru/edxp/whale/core/WhaleEdxpImpl.java | 2 ++ .../riru/edxp/whale/core/WhaleRouter.java | 15 +++++++++++++ .../edxp/yahfa/config/YahfaHookProvider.java | 5 +++-- .../edxp/yahfa/dexmaker/DexMakerUtils.java | 21 ------------------- 9 files changed, 54 insertions(+), 28 deletions(-) diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ClassUtils.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ClassUtils.java index bd46ded3..872d7b21 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ClassUtils.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/ClassUtils.java @@ -2,6 +2,9 @@ package com.elderdrivers.riru.edxp.util; import android.os.Build; +import java.lang.reflect.Member; +import java.lang.reflect.Modifier; + import de.robv.android.xposed.XposedHelpers; public class ClassUtils { @@ -33,4 +36,13 @@ public class ClassUtils { } } + public static boolean shouldDelayHook(Member hookMethod) { + if (hookMethod == null) { + return false; + } + Class declaringClass = hookMethod.getDeclaringClass(); + return Modifier.isStatic(hookMethod.getModifiers()) + && !ClassUtils.isInitialized(declaringClass); + } + } diff --git a/edxp-core/src/main/cpp/main/src/edxp_context.cpp b/edxp-core/src/main/cpp/main/src/edxp_context.cpp index dd2a6640..9b4b1823 100644 --- a/edxp-core/src/main/cpp/main/src/edxp_context.cpp +++ b/edxp-core/src/main/cpp/main/src/edxp_context.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "edxp_context.h" #include "config_manager.h" @@ -30,7 +31,15 @@ namespace edxp { return instance_; } - ALWAYS_INLINE inline jobject Context::GetCurrentClassLoader() const { + ALWAYS_INLINE bool Context::IsInitialized() const { + return initialized_; + } + + ALWAYS_INLINE Variant Context::GetVariant() const { + return variant_; + } + + ALWAYS_INLINE jobject Context::GetCurrentClassLoader() const { return inject_class_loader_; } diff --git a/edxp-core/src/main/cpp/main/src/edxp_context.h b/edxp-core/src/main/cpp/main/src/edxp_context.h index 135a6b93..e8480ac8 100644 --- a/edxp-core/src/main/cpp/main/src/edxp_context.h +++ b/edxp-core/src/main/cpp/main/src/edxp_context.h @@ -56,6 +56,10 @@ namespace edxp { jlong permitted_capabilities, jlong effective_capabilities); + bool IsInitialized() const; + + Variant GetVariant() const; + private: static Context *instance_; bool initialized_ = false; @@ -75,7 +79,6 @@ namespace edxp { void LoadDexAndInit(JNIEnv *env, const char *dex_path); jclass FindClassFromLoader(JNIEnv *env, jobject class_loader, const char *class_name) const; - }; } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleEdxpConfig.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleEdxpConfig.java index 6237cd7f..c02808d7 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleEdxpConfig.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleEdxpConfig.java @@ -3,5 +3,5 @@ package com.elderdrivers.riru.edxp.whale.config; import com.elderdrivers.riru.edxp.config.BaseEdxpConfig; public class WhaleEdxpConfig extends BaseEdxpConfig { - + } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java index cbf5cbf5..534f4d37 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java @@ -1,9 +1,11 @@ package com.elderdrivers.riru.edxp.whale.config; import com.elderdrivers.riru.edxp.art.ClassLinker; +import com.elderdrivers.riru.edxp.art.Heap; import com.elderdrivers.riru.edxp.config.BaseHookProvider; import com.elderdrivers.riru.edxp.core.ResourcesHook; import com.elderdrivers.riru.edxp.core.Yahfa; +import com.elderdrivers.riru.edxp.util.Utils; import com.lody.whale.WhaleRuntime; import java.lang.reflect.Member; @@ -13,6 +15,9 @@ import java.util.HashMap; import java.util.Map; import de.robv.android.xposed.XposedBridge; +import de.robv.android.xposed.XposedHelpers; + +import static com.elderdrivers.riru.edxp.util.ClassUtils.shouldDelayHook; public class WhaleHookProvider extends BaseHookProvider { @@ -27,7 +32,7 @@ public class WhaleHookProvider extends BaseHookProvider { @Override public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) { - resolveStaticMethod(method); +// resolveStaticMethod(method); long slot = WhaleRuntime.hookMethodNative(method.getDeclaringClass(), method, additionalInfo); synchronized (sHookedMethodSlotMap) { sHookedMethodSlotMap.put(method, slot); @@ -42,7 +47,7 @@ public class WhaleHookProvider extends BaseHookProvider { @Override public Member findMethodNative(Member hookMethod) { - return hookMethod; + return shouldDelayHook(hookMethod) ? null : hookMethod; } @Override diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleEdxpImpl.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleEdxpImpl.java index ccb13ef4..5f645b77 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleEdxpImpl.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleEdxpImpl.java @@ -7,6 +7,7 @@ import com.elderdrivers.riru.edxp.config.InstallerChooser; import com.elderdrivers.riru.edxp.core.BaseEdxpImpl; import com.elderdrivers.riru.edxp.core.EdxpImpl; import com.elderdrivers.riru.edxp.core.Main; +import com.elderdrivers.riru.edxp.core.Proxy; import com.elderdrivers.riru.edxp.core.Yahfa; import com.elderdrivers.riru.edxp.core.yahfa.HookMethodResolver; import com.elderdrivers.riru.edxp.proxy.Router; @@ -39,4 +40,5 @@ public class WhaleEdxpImpl extends BaseEdxpImpl { setInitialized(); } + } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleRouter.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleRouter.java index baa142e9..3d7cc11d 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleRouter.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/core/WhaleRouter.java @@ -1,11 +1,21 @@ package com.elderdrivers.riru.edxp.whale.core; +import android.app.ActivityThread; +import android.content.pm.ApplicationInfo; +import android.content.res.CompatibilityInfo; + +import com.elderdrivers.riru.edxp._hooker.impl.HandleBindApp; +import com.elderdrivers.riru.edxp._hooker.impl.LoadedApkCstr; +import com.elderdrivers.riru.edxp._hooker.yahfa.HandleBindAppHooker; +import com.elderdrivers.riru.edxp._hooker.yahfa.LoadedApkConstructorHooker; import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal; +import com.elderdrivers.riru.edxp.framework.Zygote; import com.elderdrivers.riru.edxp.proxy.BaseRouter; import com.elderdrivers.riru.edxp.whale.config.WhaleEdxpConfig; import com.elderdrivers.riru.edxp.whale.config.WhaleHookProvider; import de.robv.android.xposed.XposedBridge; +import de.robv.android.xposed.XposedHelpers; public class WhaleRouter extends BaseRouter { @@ -14,9 +24,14 @@ public class WhaleRouter extends BaseRouter { } public void injectConfig() { + BaseRouter.useXposedApi = true; EdXpConfigGlobal.sConfig = new WhaleEdxpConfig(); EdXpConfigGlobal.sHookProvider = new WhaleHookProvider(); XposedBridge.log("using HookProvider: " + EdXpConfigGlobal.sHookProvider.getClass().getName()); + Zygote.allowFileAcrossFork("/system/lib/libwhale.edxp.so"); + Zygote.allowFileAcrossFork("/system/lib64/libwhale.edxp.so"); + Zygote.allowFileAcrossFork("/system/lib/libart.so"); + Zygote.allowFileAcrossFork("/system/lib64/libart.so"); } } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java index 8eabd2e4..dbac995a 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java @@ -4,13 +4,14 @@ import com.elderdrivers.riru.edxp.art.ClassLinker; import com.elderdrivers.riru.edxp.config.BaseHookProvider; import com.elderdrivers.riru.edxp.core.ResourcesHook; import com.elderdrivers.riru.edxp.core.Yahfa; -import com.elderdrivers.riru.edxp.yahfa.dexmaker.DexMakerUtils; import com.elderdrivers.riru.edxp.yahfa.dexmaker.DynamicBridge; import java.lang.reflect.Member; import de.robv.android.xposed.XposedBridge; +import static com.elderdrivers.riru.edxp.util.ClassUtils.shouldDelayHook; + public class YahfaHookProvider extends BaseHookProvider { @Override @@ -25,7 +26,7 @@ public class YahfaHookProvider extends BaseHookProvider { @Override public Member findMethodNative(Member hookMethod) { - return DexMakerUtils.findMethodNative(hookMethod); + return shouldDelayHook(hookMethod) ? null : hookMethod; } @Override diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/dexmaker/DexMakerUtils.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/dexmaker/DexMakerUtils.java index 9d9f3e8a..8fbf22dc 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/dexmaker/DexMakerUtils.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/dexmaker/DexMakerUtils.java @@ -5,11 +5,7 @@ import android.os.Build; import android.text.TextUtils; import com.elderdrivers.riru.edxp.config.ConfigManager; -import com.elderdrivers.riru.edxp.util.ClassUtils; -import com.elderdrivers.riru.edxp.util.Utils; -import java.lang.reflect.Member; -import java.lang.reflect.Modifier; import java.security.MessageDigest; import java.util.HashMap; import java.util.Map; @@ -246,21 +242,4 @@ public class DexMakerUtils { } return ""; } - - public static Member findMethodNative(Member hookMethod) { - if (shouldDelayHook(hookMethod)) { - Utils.logD("solo: " + hookMethod + " hooking delayed."); - return null; - } - return hookMethod; - } - - private static boolean shouldDelayHook(Member hookMethod) { - if (hookMethod == null) { - return false; - } - Class declaringClass = hookMethod.getDeclaringClass(); - return Modifier.isStatic(hookMethod.getModifiers()) - && !ClassUtils.isInitialized(declaringClass); - } }