[core] Make hook functions' names more resonable for debug (#262)

This commit is contained in:
LoveSy 2021-03-04 16:08:10 +08:00 committed by GitHub
parent 8e86ace802
commit ef7e3d07c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 18 deletions

View File

@ -59,7 +59,7 @@ namespace lspd {
return lspd::isHooked(getArtMethodYahfa(env, member)); 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 auto in_memory_classloader = (jclass)env->NewGlobalRef(env->FindClass( "dalvik/system/InMemoryDexClassLoader"));
static jmethodID initMid = JNI_GetMethodID(env, in_memory_classloader, "<init>", static jmethodID initMid = JNI_GetMethodID(env, in_memory_classloader, "<init>",
"(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V"); "(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V");
@ -97,7 +97,7 @@ namespace lspd {
.Encode(); .Encode();
auto hookBuilder{cbuilder.CreateMethod( 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 // allocate tmp frist because of wide
auto tmp{hookBuilder.AllocRegister()}; auto tmp{hookBuilder.AllocRegister()};
hookBuilder.BuildConst(tmp, parameter_types.size()); hookBuilder.BuildConst(tmp, parameter_types.size());
@ -179,7 +179,7 @@ namespace lspd {
"(Ljava/lang/Object;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)Z"), "(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, recordHooked, "(Ljava/lang/reflect/Member;)V"),
LSP_NATIVE_METHOD(Yahfa, isHooked, "(Ljava/lang/reflect/Member;)Z"), 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) { void RegisterYahfa(JNIEnv *env) {

View File

@ -36,5 +36,5 @@ public class Yahfa {
public static native boolean isHooked(Member member); 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);
} }

View File

@ -155,19 +155,20 @@ public class HookerDexMaker {
} }
long startTime = System.nanoTime(); long startTime = System.nanoTime();
doMake(member.getDeclaringClass().getName()); doMake(member.getDeclaringClass().getName(), member instanceof Constructor ? "constructor" : member.getName());
long endTime = System.nanoTime(); long endTime = System.nanoTime();
DexLog.d("Hook time: " + (endTime - startTime) / 1e6 + "ms"); DexLog.d("Hook time: " + (endTime - startTime) / 1e6 + "ms");
} }
@SuppressWarnings("ResultOfMethodCallIgnored") @SuppressWarnings("ResultOfMethodCallIgnored")
@TargetApi(Build.VERSION_CODES.O) @TargetApi(Build.VERSION_CODES.O)
private void doMake(String hookedClassName) throws Exception { private void doMake(String hookedClassName, String methodName) throws Exception {
Class<?> hookClass = null; Class<?> hookClass = null;
// Generate a Hooker class. // Generate a Hooker class.
String className = CLASS_NAME_PREFIX; String className = CLASS_NAME_PREFIX;
hookClass = Yahfa.buildHooker(mAppClassLoader, mReturnType, mActualParameterTypes); hookClass = Yahfa.buildHooker(mAppClassLoader, mReturnType, mActualParameterTypes, methodName);
if (canCache && hookClass == null) { if (canCache && hookClass == null) {
methodName = METHOD_NAME_HOOK;
String suffix = DexMakerUtils.getSha1Hex(mMember.toString()); String suffix = DexMakerUtils.getSha1Hex(mMember.toString());
className = className + suffix; className = className + suffix;
String dexFileName = className + ".jar"; String dexFileName = className + ".jar";
@ -198,15 +199,18 @@ public class HookerDexMaker {
} }
} }
if (hookClass == null) { if (hookClass == null) {
// do everything in memory try {
DexLog.d("Falling back to generate in memory"); // do everything in memory
if (BuildConfig.DEBUG) DexLog.d("Falling back to generate in memory");
className = className + hookedClassName.replace(".", "/"); if (BuildConfig.DEBUG)
mDexMaker = new DexMaker(); className = className + hookedClassName.replace(".", "/");
doGenerate(className); mDexMaker = new DexMaker();
byte[] dexBytes = mDexMaker.generate(); doGenerate(className);
ClassLoader loader = new InMemoryDexClassLoader(ByteBuffer.wrap(dexBytes), mAppClassLoader); byte[] dexBytes = mDexMaker.generate();
hookClass = Class.forName(className.replace("/", "."), true, loader); ClassLoader loader = new InMemoryDexClassLoader(ByteBuffer.wrap(dexBytes), mAppClassLoader);
hookClass = Class.forName(className.replace("/", "."), true, loader);
} catch (Throwable ignored) {
}
} }
if (hookClass == null) { if (hookClass == null) {
@ -217,7 +221,7 @@ public class HookerDexMaker {
Method backupMethod = hookClass.getMethod(METHOD_NAME_BACKUP, mActualParameterTypes); Method backupMethod = hookClass.getMethod(METHOD_NAME_BACKUP, mActualParameterTypes);
mHooker = new LspHooker(mHookInfo, mMember, backupMethod); mHooker = new LspHooker(mHookInfo, mMember, backupMethod);
hookClass.getMethod(METHOD_NAME_SETUP, LspHooker.class).invoke(null, mHooker); 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); HookMain.backupAndHook(mMember, hookMethod, backupMethod);
} }