Whale: fix bootloop

This commit is contained in:
solohsu 2019-06-17 22:45:01 +08:00
parent 661a675a09
commit 5cba146185
9 changed files with 54 additions and 28 deletions

View File

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

View File

@ -13,6 +13,7 @@
#include <art/runtime/jni_env_ext.h>
#include <art/runtime/mirror/class.h>
#include <android-base/strings.h>
#include <nativehelper/scoped_local_ref.h>
#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_;
}

View File

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

View File

@ -3,5 +3,5 @@ package com.elderdrivers.riru.edxp.whale.config;
import com.elderdrivers.riru.edxp.config.BaseEdxpConfig;
public class WhaleEdxpConfig extends BaseEdxpConfig {
}

View File

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

View File

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

View File

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

View File

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

View File

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