[core] Make hook functions' names more resonable for debug (#262)
This commit is contained in:
parent
8e86ace802
commit
ef7e3d07c5
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue