[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));
|
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) {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue