From be722b2e2eda3987db59fbaf1e8134e4c149bea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E5=AE=AB=E9=9B=AA=E7=8F=8A?= Date: Tue, 5 Apr 2022 23:41:23 +0800 Subject: [PATCH] Fix moduleClassNames (#1796) --- .../lspd/service/ConfigFileManager.java | 12 ++++++++++ .../lspd/service/ObfuscationManager.java | 2 ++ daemon/src/main/jni/obfuscation.cpp | 22 ++++++++++++++----- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java index 06e19578..dbabb0bc 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java @@ -373,6 +373,18 @@ public class ConfigFileManager { } if (preLoadedDexes.isEmpty()) return null; if (moduleClassNames.isEmpty()) return null; + + if (obfuscate) { + for (int i = 0; i < moduleClassNames.size(); i++) { + var s = moduleClassNames.get(i); + var original = ObfuscationManager.getOriginalSignature(); + if (s.startsWith(original)) { + var obfuscated = ObfuscationManager.getObfuscatedSignature(); + moduleClassNames.add(i, s.replace(original, obfuscated)); + } + } + } + file.preLoadedDexes = preLoadedDexes; file.moduleClassNames = moduleClassNames; file.moduleLibraryNames = moduleLibraryNames; diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ObfuscationManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ObfuscationManager.java index 10934c65..fa437ec1 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ObfuscationManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ObfuscationManager.java @@ -8,4 +8,6 @@ public class ObfuscationManager { // generates signature static native String getObfuscatedSignature(); + + static native String getOriginalSignature(); } diff --git a/daemon/src/main/jni/obfuscation.cpp b/daemon/src/main/jni/obfuscation.cpp index cb38ce17..adfc0db2 100644 --- a/daemon/src/main/jni/obfuscation.cpp +++ b/daemon/src/main/jni/obfuscation.cpp @@ -40,7 +40,7 @@ using namespace lsplant; namespace { std::mutex init_lock{}; std::string obfuscated_signature; -const std::string old_signature = "Lde/robv/android/xposed"; +const std::string original_signature = "Lde/robv/android/xposed/"; jclass class_file_descriptor; jmethodID method_file_descriptor_ctor; @@ -76,11 +76,11 @@ void maybeInit(JNIEnv *env) { thread_local static std::uniform_int_distribution choose_slash(0, 10); std::string out; - size_t length = old_signature.size(); + size_t length = original_signature.size(); out.reserve(length); out += "L"; - for (size_t i = 1; i < length; i++) { + for (size_t i = 1; i < length - 1; i++) { if (choose_slash(rg) > 8 && // 80% alphabet + 20% slashes out[i - 1] != '/' && // slashes could not stick together i != 1 && // the first character should not be slash @@ -90,6 +90,8 @@ void maybeInit(JNIEnv *env) { out += chrs[pick(rg)]; } } + + out += "/"; return out; }; @@ -120,7 +122,17 @@ extern "C" JNIEXPORT jstring JNICALL Java_org_lsposed_lspd_service_ObfuscationManager_getObfuscatedSignature(JNIEnv *env, [[maybe_unused]] jclass obfuscation_manager) { maybeInit(env); - return env->NewStringUTF(obfuscated_signature.c_str()); + std::string obfuscated_signature_java(obfuscated_signature, 1); + replace(obfuscated_signature_java.begin(), obfuscated_signature_java.end(), '/', '.'); + return env->NewStringUTF(obfuscated_signature_java.c_str()); +} + +extern "C" +JNIEXPORT jstring JNICALL +Java_org_lsposed_lspd_service_ObfuscationManager_getOriginalSignature(JNIEnv *env, [[maybe_unused]] jclass obfuscation_manager) { + std::string original_signature_java(original_signature, 1); + replace(original_signature_java.begin(), original_signature_java.end(), '/', '.'); + return env->NewStringUTF(original_signature_java.c_str()); } static int obfuscateDex(const void *dex, size_t size) { @@ -131,7 +143,7 @@ static int obfuscateDex(const void *dex, size_t size) { auto ir = reader.GetIr(); for (auto &i: ir->strings) { const char *s = i->c_str(); - char* p = const_cast(strstr(s, old_signature.c_str())); + char* p = const_cast(strstr(s, original_signature.c_str())); if (p) { // NOLINTNEXTLINE bugprone-not-null-terminated-result memcpy(p, new_sig, strlen(new_sig));