From 2582eb36541979f87520f1cab97816c083b1bd72 Mon Sep 17 00:00:00 2001 From: kotori0 Date: Sat, 5 Feb 2022 12:34:57 +0800 Subject: [PATCH] add option to disable dex obfuscation --- .../org/lsposed/manager/ConfigManager.java | 19 ++++++++++ .../manager/ui/fragment/SettingsFragment.java | 9 +++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/prefs.xml | 6 ++++ daemon/src/main/cpp/obfuscation.cpp | 36 ++++++++++++++----- .../lspd/service/ConfigFileManager.java | 4 ++- .../lsposed/lspd/service/ConfigManager.java | 18 +++++++--- .../lspd/service/LSPManagerService.java | 10 ++++++ .../lspd/service/ObfuscationManager.java | 4 +++ .../org/lsposed/lspd/ILSPManagerService.aidl | 4 +++ 10 files changed, 97 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/ConfigManager.java b/app/src/main/java/org/lsposed/manager/ConfigManager.java index 0a3621c3..f54b8b65 100644 --- a/app/src/main/java/org/lsposed/manager/ConfigManager.java +++ b/app/src/main/java/org/lsposed/manager/ConfigManager.java @@ -340,4 +340,23 @@ public class ConfigManager { Log.e(App.TAG, Log.getStackTraceString(e)); } } + + public static boolean isDexObfuscateEnabled() { + try { + return LSPManagerServiceHolder.getService().getDexObfuscate(); + } catch (RemoteException e) { + Log.e(App.TAG, Log.getStackTraceString(e)); + return false; + } + } + + public static boolean setDexObfuscateEnabled(boolean enabled) { + try { + LSPManagerServiceHolder.getService().setDexObfuscate(enabled); + return true; + } catch (RemoteException e) { + Log.e(App.TAG, Log.getStackTraceString(e)); + return false; + } + } } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java index e67e5621..2732d315 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java @@ -152,6 +152,15 @@ public class SettingsFragment extends BaseFragment { ConfigManager.setVerboseLogEnabled(!(boolean) newValue)); } + SwitchPreference prefDexObfuscate = findPreference("enable_dex_obfuscate"); + if (prefDexObfuscate != null) { + prefDexObfuscate.setEnabled(installed); + prefDexObfuscate.setChecked(!installed || !ConfigManager.isDexObfuscateEnabled()); + prefDexObfuscate.setOnPreferenceChangeListener((preference, newValue) -> + ConfigManager.setDexObfuscateEnabled((boolean) newValue)); + // TODO: toast "apply on next boot"? + } + SwitchPreference prefEnableShortcut = findPreference("enable_auto_add_shortcut"); if (prefEnableShortcut != null) { prefEnableShortcut.setEnabled(installed); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ab70d39f..b7fe9129 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -182,6 +182,7 @@ Stable Beta Nightly build + Enable Dex Obfuscate Readme diff --git a/app/src/main/res/xml/prefs.xml b/app/src/main/res/xml/prefs.xml index dfa0d4c1..1a193aaf 100644 --- a/app/src/main/res/xml/prefs.xml +++ b/app/src/main/res/xml/prefs.xml @@ -90,6 +90,12 @@ android:persistent="false" android:title="@string/pref_title_disable_verbose_log" /> + + NewStringUTF(obfuscated_signature.c_str()); - } +Java_org_lsposed_lspd_service_ObfuscationManager_getObfuscatedSignature(JNIEnv *env, jclass obfuscation_manager) { + if (!obfuscate_enabled(env, obfuscation_manager)) return env->NewStringUTF(old_signature.c_str()); + if (!obfuscated_signature.empty()) return env->NewStringUTF(obfuscated_signature.c_str()); auto regen = []() { static auto& chrs = "abcdefghijklmnopqrstuvwxyz" @@ -131,7 +137,7 @@ int obfuscateDex(const void *dex, size_t size) { extern "C" JNIEXPORT jint JNICALL -Java_org_lsposed_lspd_service_ObfuscationManager_preloadDex(JNIEnv *, jclass ) { +Java_org_lsposed_lspd_service_ObfuscationManager_preloadDex(JNIEnv *env, jclass obfuscation_manager) { using namespace std::string_literals; std::lock_guard lg(dex_lock); if (lspdDex != -1) return lspdDex; @@ -149,14 +155,20 @@ Java_org_lsposed_lspd_service_ObfuscationManager_preloadDex(JNIEnv *, jclass ) { LOGD("Loaded %s with size %zu", dex_path.data(), size); + if (!obfuscate_enabled(env, obfuscation_manager)) { + lspdDex = fileno(f.get()); + return lspdDex; + } + auto *addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileno(f.get()), 0); if (addr == MAP_FAILED) { - PLOGE("Read dex"); + PLOGE("Map dex"); return -1; } auto new_dex = obfuscateDex(addr, size); + munmap(addr, size); LOGD("LSPApplicationService::preloadDex: %d, size=%zu", new_dex, ASharedMemory_getSize(new_dex)); lspdDex = new_dex; return new_dex; @@ -164,8 +176,13 @@ Java_org_lsposed_lspd_service_ObfuscationManager_preloadDex(JNIEnv *, jclass ) { extern "C" JNIEXPORT jlong JNICALL -Java_org_lsposed_lspd_service_ObfuscationManager_getPreloadedDexSize(JNIEnv *, jclass ) { +Java_org_lsposed_lspd_service_ObfuscationManager_getPreloadedDexSize(JNIEnv *env, jclass obfuscation_manager) { if (lspdDex != -1) { + if (!obfuscate_enabled(env, obfuscation_manager)) { + auto size = lseek(lspdDex, 0, SEEK_END); + lseek(lspdDex, 0, SEEK_SET); + return size; + } return ASharedMemory_getSize(lspdDex); } return 0; @@ -173,8 +190,9 @@ Java_org_lsposed_lspd_service_ObfuscationManager_getPreloadedDexSize(JNIEnv *, j extern "C" JNIEXPORT jobject -Java_org_lsposed_lspd_service_ObfuscationManager_obfuscateDex(JNIEnv *env, jclass /*clazz*/, +Java_org_lsposed_lspd_service_ObfuscationManager_obfuscateDex(JNIEnv *env, jclass obfuscation_manager, jobject memory) { + if (!obfuscate_enabled(env, obfuscation_manager)) { return memory; } int fd = ASharedMemory_dupFromJava(env, memory); auto size = ASharedMemory_getSize(fd); LOGD("fd=%d, size=%zu", fd, size); 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 d7610f10..edf4dc83 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java @@ -316,7 +316,9 @@ public class ConfigFileManager { Channels.newChannel(in).read(byteBuffer); SharedMemory.unmap(byteBuffer); var new_memory = ObfuscationManager.obfuscateDex(memory); - memory.close(); + if (memory != new_memory) { + memory.close(); + } new_memory.setProtect(OsConstants.PROT_READ); preLoadedDexes.add(new_memory); } catch (IOException | ErrnoException e) { diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java index b0332ab2..79af7595 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -87,6 +87,7 @@ public class ConfigManager { SQLiteDatabase.openOrCreateDatabase(ConfigFileManager.dbPath, null); private boolean verboseLog = true; + private boolean dexObfuscate = true; private boolean autoAddShortcut = true; private String miscPath = null; @@ -867,6 +868,19 @@ public class ConfigManager { verboseLog = on; } + public boolean verboseLog() { + return BuildConfig.DEBUG || verboseLog; + } + + public void setDexObfuscate(boolean on) { + updateModulePrefs("lspd", 0, "config", "enable_dex_obfuscate", on); + dexObfuscate = on; + } + + public boolean dexObfuscate() { + return dexObfuscate; + } + public boolean isAddShortcut() { Log.d(TAG, "Auto add shortcut=" + autoAddShortcut); return autoAddShortcut; @@ -877,10 +891,6 @@ public class ConfigManager { this.autoAddShortcut = on; } - public boolean verboseLog() { - return BuildConfig.DEBUG || verboseLog; - } - public ParcelFileDescriptor getManagerApk() { try { return ConfigFileManager.getManagerApk(); diff --git a/daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java b/daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java index 2bc0523c..f0341df9 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java @@ -769,4 +769,14 @@ public class LSPManagerService extends ILSPManagerService.Stub { public boolean performDexOptMode(String packageName) throws RemoteException { return PackageService.performDexOptMode(packageName); } + + @Override + public boolean getDexObfuscate() throws RemoteException { + return ConfigManager.getInstance().dexObfuscate(); + } + + @Override + public void setDexObfuscate(boolean enabled) throws RemoteException { + ConfigManager.getInstance().setDexObfuscate(enabled); + } } 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 c198c60a..cf6d5e71 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ObfuscationManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ObfuscationManager.java @@ -3,6 +3,10 @@ package org.lsposed.lspd.service; import android.os.SharedMemory; public class ObfuscationManager { + static boolean enabled() { + return ConfigManager.getInstance().dexObfuscate(); + } + static native void init(); // For module dexes diff --git a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl index d434db83..7fcbb9dc 100644 --- a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl +++ b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl @@ -75,4 +75,8 @@ interface ILSPManagerService { boolean performDexOptMode(String packageName) = 40; List getDenyListPackages() = 41; + + boolean getDexObfuscate() = 42; + + void setDexObfuscate(boolean enable) = 43; }