add option to disable dex obfuscation

This commit is contained in:
kotori0 2022-02-05 12:34:57 +08:00 committed by LoveSy
parent 67e3460d7a
commit 2582eb3654
10 changed files with 97 additions and 14 deletions

View File

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

View File

@ -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);

View File

@ -182,6 +182,7 @@
<string name="update_channel_stable">Stable</string>
<string name="update_channel_bate">Beta</string>
<string name="update_channel_nightly">Nightly build</string>
<string name="pref_title_enable_dex_obfuscate">Enable Dex Obfuscate</string>
<!-- Module Repo -->
<string name="module_readme">Readme</string>

View File

@ -90,6 +90,12 @@
android:persistent="false"
android:title="@string/pref_title_disable_verbose_log" />
<SwitchPreference
android:defaultValue="true"
android:key="enable_dex_obfuscate"
android:persistent="false"
android:title="@string/pref_title_enable_dex_obfuscate" />
<Preference
android:icon="@drawable/ic_outline_app_shortcut_24"
android:key="add_shortcut"

View File

@ -35,9 +35,16 @@
#include "slicer/writer.h"
#include "obfuscation.h"
bool obfuscate_enabled(JNIEnv* env, jclass obfuscation_manager) {
auto method_enabled = JNI_GetMethodID(env, obfuscation_manager, "enabled", "()Z");
auto result = JNI_CallStaticBooleanMethod(env, obfuscation_manager, method_enabled);
return result;
}
extern "C"
JNIEXPORT void JNICALL
Java_org_lsposed_lspd_service_ObfuscationManager_init(JNIEnv *env, jclass ) {
Java_org_lsposed_lspd_service_ObfuscationManager_init(JNIEnv *env, jclass obfuscation_manager) {
if (!obfuscate_enabled(env, obfuscation_manager)) return;
LOGD("ObfuscationManager.init");
if (auto file_descriptor = JNI_FindClass(env, "java/io/FileDescriptor")) {
class_file_descriptor = JNI_NewGlobalRef(env, file_descriptor);
@ -55,10 +62,9 @@ Java_org_lsposed_lspd_service_ObfuscationManager_init(JNIEnv *env, jclass ) {
extern "C"
JNIEXPORT jstring JNICALL
Java_org_lsposed_lspd_service_ObfuscationManager_getObfuscatedSignature(JNIEnv *env, jclass ) {
if (!obfuscated_signature.empty()) {
return env->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);

View File

@ -316,7 +316,9 @@ public class ConfigFileManager {
Channels.newChannel(in).read(byteBuffer);
SharedMemory.unmap(byteBuffer);
var new_memory = ObfuscationManager.obfuscateDex(memory);
if (memory != new_memory) {
memory.close();
}
new_memory.setProtect(OsConstants.PROT_READ);
preLoadedDexes.add(new_memory);
} catch (IOException | ErrnoException e) {

View File

@ -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();

View File

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

View File

@ -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

View File

@ -75,4 +75,8 @@ interface ILSPManagerService {
boolean performDexOptMode(String packageName) = 40;
List<String> getDenyListPackages() = 41;
boolean getDexObfuscate() = 42;
void setDexObfuscate(boolean enable) = 43;
}