Fix moduleClassNames (#1796)

This commit is contained in:
南宫雪珊 2022-04-05 23:41:23 +08:00 committed by GitHub
parent ee2c1a3320
commit be722b2e2e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 5 deletions

View File

@ -373,6 +373,18 @@ public class ConfigFileManager {
} }
if (preLoadedDexes.isEmpty()) return null; if (preLoadedDexes.isEmpty()) return null;
if (moduleClassNames.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.preLoadedDexes = preLoadedDexes;
file.moduleClassNames = moduleClassNames; file.moduleClassNames = moduleClassNames;
file.moduleLibraryNames = moduleLibraryNames; file.moduleLibraryNames = moduleLibraryNames;

View File

@ -8,4 +8,6 @@ public class ObfuscationManager {
// generates signature // generates signature
static native String getObfuscatedSignature(); static native String getObfuscatedSignature();
static native String getOriginalSignature();
} }

View File

@ -40,7 +40,7 @@ using namespace lsplant;
namespace { namespace {
std::mutex init_lock{}; std::mutex init_lock{};
std::string obfuscated_signature; 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; jclass class_file_descriptor;
jmethodID method_file_descriptor_ctor; jmethodID method_file_descriptor_ctor;
@ -76,11 +76,11 @@ void maybeInit(JNIEnv *env) {
thread_local static std::uniform_int_distribution<std::string::size_type> choose_slash(0, 10); thread_local static std::uniform_int_distribution<std::string::size_type> choose_slash(0, 10);
std::string out; std::string out;
size_t length = old_signature.size(); size_t length = original_signature.size();
out.reserve(length); out.reserve(length);
out += "L"; 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 if (choose_slash(rg) > 8 && // 80% alphabet + 20% slashes
out[i - 1] != '/' && // slashes could not stick together out[i - 1] != '/' && // slashes could not stick together
i != 1 && // the first character should not be slash i != 1 && // the first character should not be slash
@ -90,6 +90,8 @@ void maybeInit(JNIEnv *env) {
out += chrs[pick(rg)]; out += chrs[pick(rg)];
} }
} }
out += "/";
return out; return out;
}; };
@ -120,7 +122,17 @@ extern "C"
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_org_lsposed_lspd_service_ObfuscationManager_getObfuscatedSignature(JNIEnv *env, [[maybe_unused]] jclass obfuscation_manager) { Java_org_lsposed_lspd_service_ObfuscationManager_getObfuscatedSignature(JNIEnv *env, [[maybe_unused]] jclass obfuscation_manager) {
maybeInit(env); 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) { 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(); auto ir = reader.GetIr();
for (auto &i: ir->strings) { for (auto &i: ir->strings) {
const char *s = i->c_str(); const char *s = i->c_str();
char* p = const_cast<char *>(strstr(s, old_signature.c_str())); char* p = const_cast<char *>(strstr(s, original_signature.c_str()));
if (p) { if (p) {
// NOLINTNEXTLINE bugprone-not-null-terminated-result // NOLINTNEXTLINE bugprone-not-null-terminated-result
memcpy(p, new_sig, strlen(new_sig)); memcpy(p, new_sig, strlen(new_sig));