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;
}