[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));
}
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, "<init>",
"(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);
}
}
}

View File

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

View File

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