diff --git a/core/src/main/cpp/main/src/context.cpp b/core/src/main/cpp/main/src/context.cpp index 3c1a6010..687e3452 100644 --- a/core/src/main/cpp/main/src/context.cpp +++ b/core/src/main/cpp/main/src/context.cpp @@ -128,7 +128,7 @@ namespace lspd { RegisterResourcesHook(env); RegisterArtClassLinker(env); - RegisterYahfa(env, obfuscated_signature_); + RegisterYahfa(env); RegisterPendingHooks(env); RegisterNativeAPI(env); } @@ -198,14 +198,12 @@ namespace lspd { // Call application_binder directly if application binder is available, // or we proxy the request from system server binder - auto dex = instance->RequestLSPDex(env, application_binder ? application_binder : system_server_binder); - auto dex_fd = std::get<0>(dex); - LoadDex(env, dex_fd, std::get<1>(dex)); + auto [dex_fd, size]= instance->RequestLSPDex(env, application_binder ? application_binder : system_server_binder); + LoadDex(env, dex_fd, size); close(dex_fd); instance->HookBridge(*this, env); if (application_binder) { - obfuscated_signature_ = std::move(std::get<2>(dex)); InstallInlineHooks(); Init(env); FindAndCall(env, "forkSystemServerPost", "(Landroid/os/IBinder;)V", application_binder); @@ -265,11 +263,9 @@ namespace lspd { : instance->RequestBinder(env, nice_name); if (binder) { InstallInlineHooks(); - auto dex = instance->RequestLSPDex(env, binder); - auto dex_fd = std::get<0>(dex); - LoadDex(env, dex_fd, std::get<1>(dex)); + auto [dex_fd, size] = instance->RequestLSPDex(env, binder); + LoadDex(env, dex_fd, size); close(dex_fd); - obfuscated_signature_ = std::move(std::get<2>(dex)); Init(env); LOGD("Done prepare"); FindAndCall(env, "forkAndSpecializePost", diff --git a/core/src/main/cpp/main/src/context.h b/core/src/main/cpp/main/src/context.h index ef36f957..77085c30 100644 --- a/core/src/main/cpp/main/src/context.h +++ b/core/src/main/cpp/main/src/context.h @@ -69,7 +69,6 @@ namespace lspd { jclass class_linker_class_ = nullptr; jmethodID post_fixup_static_mid_ = nullptr; bool skip_ = false; - std::string obfuscated_signature_; struct PreloadedDex { diff --git a/core/src/main/cpp/main/src/jni/yahfa.cpp b/core/src/main/cpp/main/src/jni/yahfa.cpp index 501381c3..8a9d7a84 100644 --- a/core/src/main/cpp/main/src/jni/yahfa.cpp +++ b/core/src/main/cpp/main/src/jni/yahfa.cpp @@ -38,8 +38,6 @@ namespace lspd { std::vector> jit_movements_; std::shared_mutex jit_movements_lock_; - - std::string obfuscated_signature_; } bool isHooked(void *art_method) { @@ -96,7 +94,7 @@ namespace lspd { } LSP_DEF_NATIVE_METHOD(jclass, Yahfa, buildHooker, jobject app_class_loader, jchar return_class, - jcharArray classes, jstring method_name) { + jcharArray classes, jstring method_name, jstring hooker_name) { static auto *kInMemoryClassloader = JNI_NewGlobalRef(env, JNI_FindClass(env, "dalvik/system/InMemoryDexClassLoader")); static jmethodID kInitMid = JNI_GetMethodID(env, kInMemoryClassloader, "", @@ -121,7 +119,7 @@ namespace lspd { cbuilder.set_source_file("LSP"); auto hooker_type = - TypeDescriptor::FromClassname(obfuscated_signature_.c_str()); + TypeDescriptor::FromClassname(JUTFString(env, hooker_name).get()); auto *hooker_field = cbuilder.CreateField("hooker", hooker_type) .access_flags(dex::kAccStatic) @@ -212,13 +210,10 @@ namespace lspd { "(Ljava/lang/reflect/Executable;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Z)Z"), LSP_NATIVE_METHOD(Yahfa, isHooked, "(Ljava/lang/reflect/Executable;)Z"), LSP_NATIVE_METHOD(Yahfa, buildHooker, - "(Ljava/lang/ClassLoader;C[CLjava/lang/String;)Ljava/lang/Class;"), + "(Ljava/lang/ClassLoader;C[CLjava/lang/String;Ljava/lang/String;)Ljava/lang/Class;"), }; - void RegisterYahfa(JNIEnv *env, std::string obfuscated_signature) { - std::replace(obfuscated_signature.begin(), obfuscated_signature.end(), '/', '.'); - obfuscated_signature_ = obfuscated_signature.substr(1) + ".LspHooker"; - LOGD("RegisterYahfa: obfuscated_signature_=%s", obfuscated_signature_.c_str()); + void RegisterYahfa(JNIEnv *env) { REGISTER_LSP_NATIVE_METHODS(Yahfa); } diff --git a/core/src/main/cpp/main/src/jni/yahfa.h b/core/src/main/cpp/main/src/jni/yahfa.h index ae39fe5d..fe16429f 100644 --- a/core/src/main/cpp/main/src/jni/yahfa.h +++ b/core/src/main/cpp/main/src/jni/yahfa.h @@ -30,6 +30,6 @@ namespace lspd { std::vector> getJitMovements(); - void RegisterYahfa(JNIEnv *, std::string obfuscated_signature); + void RegisterYahfa(JNIEnv *); } // namespace lspd diff --git a/core/src/main/cpp/main/src/service.cpp b/core/src/main/cpp/main/src/service.cpp index 15783626..dc8616bc 100644 --- a/core/src/main/cpp/main/src/service.cpp +++ b/core/src/main/cpp/main/src/service.cpp @@ -309,7 +309,7 @@ namespace lspd { return app_binder; } - std::tuple Service::RequestLSPDex(JNIEnv *env, const ScopedLocalRef &binder) { + std::tuple Service::RequestLSPDex(JNIEnv *env, const ScopedLocalRef &binder) { auto data = JNI_CallStaticObjectMethod(env, parcel_class_, obtain_method_); auto reply = JNI_CallStaticObjectMethod(env, parcel_class_, obtain_method_); auto res = JNI_CallBooleanMethod(env, binder, transact_method_, @@ -318,18 +318,15 @@ namespace lspd { reply, 0); if (!res) { LOGE("Service::RequestLSPDex: transaction failed?"); - return {-1, 0, ""}; + return {-1, 0}; } auto parcel_fd = JNI_CallObjectMethod(env, reply, read_file_descriptor_method_); int fd = JNI_CallIntMethod(env, parcel_fd, detach_fd_method_); auto size = JNI_CallLongMethod(env, reply, read_long_method_); - auto signature = JNI_CallObjectMethod(env, reply, read_string_method_); JNI_CallVoidMethod(env, data, recycleMethod_); JNI_CallVoidMethod(env, reply, recycleMethod_); - JUTFString sign(env, static_cast(signature.get())); - - LOGD("Service::RequestLSPDex fd=%d, size=%zu, sign=%s", fd, size, sign.get()); - return {fd, size, sign.get()}; + LOGD("Service::RequestLSPDex fd=%d, size=%zu", fd, size); + return {fd, size}; } } // namespace lspd diff --git a/core/src/main/cpp/main/src/service.h b/core/src/main/cpp/main/src/service.h index 1bd89fac..2e6a7b11 100644 --- a/core/src/main/cpp/main/src/service.h +++ b/core/src/main/cpp/main/src/service.h @@ -57,7 +57,7 @@ namespace lspd { ScopedLocalRef RequestApplicationBinderFromSystemServer(JNIEnv *env, const ScopedLocalRef &system_server_binder); - std::tuple RequestLSPDex(JNIEnv *env, const ScopedLocalRef &binder); + std::tuple RequestLSPDex(JNIEnv *env, const ScopedLocalRef &binder); private: inline static std::unique_ptr instance_ = std::make_unique(); diff --git a/core/src/main/java/org/lsposed/lspd/nativebridge/Yahfa.java b/core/src/main/java/org/lsposed/lspd/nativebridge/Yahfa.java index 7dd091da..05a5086d 100644 --- a/core/src/main/java/org/lsposed/lspd/nativebridge/Yahfa.java +++ b/core/src/main/java/org/lsposed/lspd/nativebridge/Yahfa.java @@ -34,5 +34,5 @@ public class Yahfa { public static native boolean isHooked(Executable member); - public static native Class buildHooker(ClassLoader appClassLoader, char returnType, char[] params, String methodName); + public static native Class buildHooker(ClassLoader appClassLoader, char returnType, char[] params, String methodName, String hookerName); } diff --git a/core/src/main/java/org/lsposed/lspd/yahfa/dexmaker/HookerDexMaker.java b/core/src/main/java/org/lsposed/lspd/yahfa/dexmaker/HookerDexMaker.java index 8b396ed5..7c92e2e2 100644 --- a/core/src/main/java/org/lsposed/lspd/yahfa/dexmaker/HookerDexMaker.java +++ b/core/src/main/java/org/lsposed/lspd/yahfa/dexmaker/HookerDexMaker.java @@ -105,7 +105,7 @@ public class HookerDexMaker { } private void doMake(String methodName) throws Exception { - Class hookClass = Yahfa.buildHooker(LspHooker.class.getClassLoader(), getDescriptor(mReturnType), getDescriptors(mActualParameterTypes), methodName); + Class hookClass = Yahfa.buildHooker(LspHooker.class.getClassLoader(), getDescriptor(mReturnType), getDescriptors(mActualParameterTypes), methodName, LspHooker.class.getCanonicalName()); if (hookClass == null) throw new IllegalStateException("Failed to hook " + methodName); // Execute our newly-generated code in-process. Method backupMethod = hookClass.getMethod(METHOD_NAME_BACKUP, mActualParameterTypes); diff --git a/daemon/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java b/daemon/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java index 93463c08..4d69d392 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java @@ -54,7 +54,6 @@ public class LSPApplicationService extends ILSPApplicationService.Stub { ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(ObfuscationManager.preloadDex()); reply.writeFileDescriptor(pfd.getFileDescriptor()); reply.writeLong(ObfuscationManager.getPreloadedDexSize()); - reply.writeString(ObfuscationManager.getObfuscatedSignature()); } catch (IOException ignored) { Log.e(TAG, "LSPApplicationService.onTransact: ParcelFileDescriptor.fromFd failed"); return false;