add option to disable dex obfuscation
This commit is contained in:
parent
67e3460d7a
commit
2582eb3654
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -75,4 +75,8 @@ interface ILSPManagerService {
|
|||
boolean performDexOptMode(String packageName) = 40;
|
||||
|
||||
List<String> getDenyListPackages() = 41;
|
||||
|
||||
boolean getDexObfuscate() = 42;
|
||||
|
||||
void setDexObfuscate(boolean enable) = 43;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue