From ef7e3d07c571e980360d43b405d9a4d7d8fe6a82 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 4 Mar 2021 16:08:10 +0800 Subject: [PATCH] [core] Make hook functions' names more resonable for debug (#262) --- core/src/main/cpp/main/src/jni/yahfa.cpp | 8 ++--- .../lsposed/lspd/nativebridge/Yahfa.java | 2 +- .../lspd/yahfa/dexmaker/HookerDexMaker.java | 30 +++++++++++-------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/core/src/main/cpp/main/src/jni/yahfa.cpp b/core/src/main/cpp/main/src/jni/yahfa.cpp index 23b88a50..2d4d9f1c 100644 --- a/core/src/main/cpp/main/src/jni/yahfa.cpp +++ b/core/src/main/cpp/main/src/jni/yahfa.cpp @@ -59,7 +59,7 @@ namespace lspd { return lspd::isHooked(getArtMethodYahfa(env, member)); } - LSP_DEF_NATIVE_METHOD(jclass, Yahfa, buildHooker, jobject app_class_loader, jclass return_class, jobjectArray classes) { + LSP_DEF_NATIVE_METHOD(jclass, Yahfa, buildHooker, jobject app_class_loader, jclass return_class, jobjectArray classes, jstring method_name) { static auto in_memory_classloader = (jclass)env->NewGlobalRef(env->FindClass( "dalvik/system/InMemoryDexClassLoader")); static jmethodID initMid = JNI_GetMethodID(env, in_memory_classloader, "", "(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V"); @@ -97,7 +97,7 @@ namespace lspd { .Encode(); auto hookBuilder{cbuilder.CreateMethod( - "hook", Prototype{return_type, parameter_types})}; + JUTFString(env, method_name), Prototype{return_type, parameter_types})}; // allocate tmp frist because of wide auto tmp{hookBuilder.AllocRegister()}; hookBuilder.BuildConst(tmp, parameter_types.size()); @@ -179,11 +179,11 @@ namespace lspd { "(Ljava/lang/Object;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)Z"), LSP_NATIVE_METHOD(Yahfa, recordHooked, "(Ljava/lang/reflect/Member;)V"), LSP_NATIVE_METHOD(Yahfa, isHooked, "(Ljava/lang/reflect/Member;)Z"), - LSP_NATIVE_METHOD(Yahfa, buildHooker, "(Ljava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Class;"), + LSP_NATIVE_METHOD(Yahfa, buildHooker, "(Ljava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Class;"), }; void RegisterYahfa(JNIEnv *env) { REGISTER_LSP_NATIVE_METHODS(Yahfa); } -} \ No newline at end of file +} diff --git a/core/src/main/java/io/github/lsposed/lspd/nativebridge/Yahfa.java b/core/src/main/java/io/github/lsposed/lspd/nativebridge/Yahfa.java index 330c94ac..9b3f2d71 100644 --- a/core/src/main/java/io/github/lsposed/lspd/nativebridge/Yahfa.java +++ b/core/src/main/java/io/github/lsposed/lspd/nativebridge/Yahfa.java @@ -36,5 +36,5 @@ public class Yahfa { public static native boolean isHooked(Member member); - public static native Class buildHooker(ClassLoader appClassLoader, Class returnType, Class[] params); + public static native Class buildHooker(ClassLoader appClassLoader, Class returnType, Class[] params, String methodName); } diff --git a/core/src/main/java/io/github/lsposed/lspd/yahfa/dexmaker/HookerDexMaker.java b/core/src/main/java/io/github/lsposed/lspd/yahfa/dexmaker/HookerDexMaker.java index a5c49753..815995e0 100644 --- a/core/src/main/java/io/github/lsposed/lspd/yahfa/dexmaker/HookerDexMaker.java +++ b/core/src/main/java/io/github/lsposed/lspd/yahfa/dexmaker/HookerDexMaker.java @@ -155,19 +155,20 @@ public class HookerDexMaker { } long startTime = System.nanoTime(); - doMake(member.getDeclaringClass().getName()); + doMake(member.getDeclaringClass().getName(), member instanceof Constructor ? "constructor" : member.getName()); long endTime = System.nanoTime(); DexLog.d("Hook time: " + (endTime - startTime) / 1e6 + "ms"); } @SuppressWarnings("ResultOfMethodCallIgnored") @TargetApi(Build.VERSION_CODES.O) - private void doMake(String hookedClassName) throws Exception { + private void doMake(String hookedClassName, String methodName) throws Exception { Class hookClass = null; // Generate a Hooker class. String className = CLASS_NAME_PREFIX; - hookClass = Yahfa.buildHooker(mAppClassLoader, mReturnType, mActualParameterTypes); + hookClass = Yahfa.buildHooker(mAppClassLoader, mReturnType, mActualParameterTypes, methodName); if (canCache && hookClass == null) { + methodName = METHOD_NAME_HOOK; String suffix = DexMakerUtils.getSha1Hex(mMember.toString()); className = className + suffix; String dexFileName = className + ".jar"; @@ -198,15 +199,18 @@ public class HookerDexMaker { } } if (hookClass == null) { - // do everything in memory - DexLog.d("Falling back to generate in memory"); - if (BuildConfig.DEBUG) - className = className + hookedClassName.replace(".", "/"); - mDexMaker = new DexMaker(); - doGenerate(className); - byte[] dexBytes = mDexMaker.generate(); - ClassLoader loader = new InMemoryDexClassLoader(ByteBuffer.wrap(dexBytes), mAppClassLoader); - hookClass = Class.forName(className.replace("/", "."), true, loader); + try { + // do everything in memory + DexLog.d("Falling back to generate in memory"); + if (BuildConfig.DEBUG) + className = className + hookedClassName.replace(".", "/"); + mDexMaker = new DexMaker(); + doGenerate(className); + byte[] dexBytes = mDexMaker.generate(); + ClassLoader loader = new InMemoryDexClassLoader(ByteBuffer.wrap(dexBytes), mAppClassLoader); + hookClass = Class.forName(className.replace("/", "."), true, loader); + } catch (Throwable ignored) { + } } if (hookClass == null) { @@ -217,7 +221,7 @@ public class HookerDexMaker { Method backupMethod = hookClass.getMethod(METHOD_NAME_BACKUP, mActualParameterTypes); mHooker = new LspHooker(mHookInfo, mMember, backupMethod); hookClass.getMethod(METHOD_NAME_SETUP, LspHooker.class).invoke(null, mHooker); - Method hookMethod = hookClass.getMethod(METHOD_NAME_HOOK, mActualParameterTypes); + Method hookMethod = hookClass.getMethod(methodName, mActualParameterTypes); HookMain.backupAndHook(mMember, hookMethod, backupMethod); }