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));
|
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));
|
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");
|
SwitchPreference prefEnableShortcut = findPreference("enable_auto_add_shortcut");
|
||||||
if (prefEnableShortcut != null) {
|
if (prefEnableShortcut != null) {
|
||||||
prefEnableShortcut.setEnabled(installed);
|
prefEnableShortcut.setEnabled(installed);
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,7 @@
|
||||||
<string name="update_channel_stable">Stable</string>
|
<string name="update_channel_stable">Stable</string>
|
||||||
<string name="update_channel_bate">Beta</string>
|
<string name="update_channel_bate">Beta</string>
|
||||||
<string name="update_channel_nightly">Nightly build</string>
|
<string name="update_channel_nightly">Nightly build</string>
|
||||||
|
<string name="pref_title_enable_dex_obfuscate">Enable Dex Obfuscate</string>
|
||||||
|
|
||||||
<!-- Module Repo -->
|
<!-- Module Repo -->
|
||||||
<string name="module_readme">Readme</string>
|
<string name="module_readme">Readme</string>
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,12 @@
|
||||||
android:persistent="false"
|
android:persistent="false"
|
||||||
android:title="@string/pref_title_disable_verbose_log" />
|
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
|
<Preference
|
||||||
android:icon="@drawable/ic_outline_app_shortcut_24"
|
android:icon="@drawable/ic_outline_app_shortcut_24"
|
||||||
android:key="add_shortcut"
|
android:key="add_shortcut"
|
||||||
|
|
|
||||||
|
|
@ -35,9 +35,16 @@
|
||||||
#include "slicer/writer.h"
|
#include "slicer/writer.h"
|
||||||
#include "obfuscation.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"
|
extern "C"
|
||||||
JNIEXPORT void JNICALL
|
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");
|
LOGD("ObfuscationManager.init");
|
||||||
if (auto file_descriptor = JNI_FindClass(env, "java/io/FileDescriptor")) {
|
if (auto file_descriptor = JNI_FindClass(env, "java/io/FileDescriptor")) {
|
||||||
class_file_descriptor = JNI_NewGlobalRef(env, file_descriptor);
|
class_file_descriptor = JNI_NewGlobalRef(env, file_descriptor);
|
||||||
|
|
@ -55,10 +62,9 @@ Java_org_lsposed_lspd_service_ObfuscationManager_init(JNIEnv *env, jclass ) {
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
JNIEXPORT jstring JNICALL
|
JNIEXPORT jstring JNICALL
|
||||||
Java_org_lsposed_lspd_service_ObfuscationManager_getObfuscatedSignature(JNIEnv *env, jclass ) {
|
Java_org_lsposed_lspd_service_ObfuscationManager_getObfuscatedSignature(JNIEnv *env, jclass obfuscation_manager) {
|
||||||
if (!obfuscated_signature.empty()) {
|
if (!obfuscate_enabled(env, obfuscation_manager)) return env->NewStringUTF(old_signature.c_str());
|
||||||
return env->NewStringUTF(obfuscated_signature.c_str());
|
if (!obfuscated_signature.empty()) return env->NewStringUTF(obfuscated_signature.c_str());
|
||||||
}
|
|
||||||
|
|
||||||
auto regen = []() {
|
auto regen = []() {
|
||||||
static auto& chrs = "abcdefghijklmnopqrstuvwxyz"
|
static auto& chrs = "abcdefghijklmnopqrstuvwxyz"
|
||||||
|
|
@ -131,7 +137,7 @@ int obfuscateDex(const void *dex, size_t size) {
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
JNIEXPORT jint JNICALL
|
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;
|
using namespace std::string_literals;
|
||||||
std::lock_guard lg(dex_lock);
|
std::lock_guard lg(dex_lock);
|
||||||
if (lspdDex != -1) return lspdDex;
|
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);
|
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);
|
auto *addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileno(f.get()), 0);
|
||||||
|
|
||||||
if (addr == MAP_FAILED) {
|
if (addr == MAP_FAILED) {
|
||||||
PLOGE("Read dex");
|
PLOGE("Map dex");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto new_dex = obfuscateDex(addr, size);
|
auto new_dex = obfuscateDex(addr, size);
|
||||||
|
munmap(addr, size);
|
||||||
LOGD("LSPApplicationService::preloadDex: %d, size=%zu", new_dex, ASharedMemory_getSize(new_dex));
|
LOGD("LSPApplicationService::preloadDex: %d, size=%zu", new_dex, ASharedMemory_getSize(new_dex));
|
||||||
lspdDex = new_dex;
|
lspdDex = new_dex;
|
||||||
return new_dex;
|
return new_dex;
|
||||||
|
|
@ -164,8 +176,13 @@ Java_org_lsposed_lspd_service_ObfuscationManager_preloadDex(JNIEnv *, jclass ) {
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
JNIEXPORT jlong JNICALL
|
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 (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 ASharedMemory_getSize(lspdDex);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -173,8 +190,9 @@ Java_org_lsposed_lspd_service_ObfuscationManager_getPreloadedDexSize(JNIEnv *, j
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
JNIEXPORT jobject
|
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) {
|
jobject memory) {
|
||||||
|
if (!obfuscate_enabled(env, obfuscation_manager)) { return memory; }
|
||||||
int fd = ASharedMemory_dupFromJava(env, memory);
|
int fd = ASharedMemory_dupFromJava(env, memory);
|
||||||
auto size = ASharedMemory_getSize(fd);
|
auto size = ASharedMemory_getSize(fd);
|
||||||
LOGD("fd=%d, size=%zu", fd, size);
|
LOGD("fd=%d, size=%zu", fd, size);
|
||||||
|
|
|
||||||
|
|
@ -316,7 +316,9 @@ public class ConfigFileManager {
|
||||||
Channels.newChannel(in).read(byteBuffer);
|
Channels.newChannel(in).read(byteBuffer);
|
||||||
SharedMemory.unmap(byteBuffer);
|
SharedMemory.unmap(byteBuffer);
|
||||||
var new_memory = ObfuscationManager.obfuscateDex(memory);
|
var new_memory = ObfuscationManager.obfuscateDex(memory);
|
||||||
|
if (memory != new_memory) {
|
||||||
memory.close();
|
memory.close();
|
||||||
|
}
|
||||||
new_memory.setProtect(OsConstants.PROT_READ);
|
new_memory.setProtect(OsConstants.PROT_READ);
|
||||||
preLoadedDexes.add(new_memory);
|
preLoadedDexes.add(new_memory);
|
||||||
} catch (IOException | ErrnoException e) {
|
} catch (IOException | ErrnoException e) {
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,7 @@ public class ConfigManager {
|
||||||
SQLiteDatabase.openOrCreateDatabase(ConfigFileManager.dbPath, null);
|
SQLiteDatabase.openOrCreateDatabase(ConfigFileManager.dbPath, null);
|
||||||
|
|
||||||
private boolean verboseLog = true;
|
private boolean verboseLog = true;
|
||||||
|
private boolean dexObfuscate = true;
|
||||||
private boolean autoAddShortcut = true;
|
private boolean autoAddShortcut = true;
|
||||||
private String miscPath = null;
|
private String miscPath = null;
|
||||||
|
|
||||||
|
|
@ -867,6 +868,19 @@ public class ConfigManager {
|
||||||
verboseLog = on;
|
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() {
|
public boolean isAddShortcut() {
|
||||||
Log.d(TAG, "Auto add shortcut=" + autoAddShortcut);
|
Log.d(TAG, "Auto add shortcut=" + autoAddShortcut);
|
||||||
return autoAddShortcut;
|
return autoAddShortcut;
|
||||||
|
|
@ -877,10 +891,6 @@ public class ConfigManager {
|
||||||
this.autoAddShortcut = on;
|
this.autoAddShortcut = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean verboseLog() {
|
|
||||||
return BuildConfig.DEBUG || verboseLog;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ParcelFileDescriptor getManagerApk() {
|
public ParcelFileDescriptor getManagerApk() {
|
||||||
try {
|
try {
|
||||||
return ConfigFileManager.getManagerApk();
|
return ConfigFileManager.getManagerApk();
|
||||||
|
|
|
||||||
|
|
@ -769,4 +769,14 @@ public class LSPManagerService extends ILSPManagerService.Stub {
|
||||||
public boolean performDexOptMode(String packageName) throws RemoteException {
|
public boolean performDexOptMode(String packageName) throws RemoteException {
|
||||||
return PackageService.performDexOptMode(packageName);
|
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;
|
import android.os.SharedMemory;
|
||||||
|
|
||||||
public class ObfuscationManager {
|
public class ObfuscationManager {
|
||||||
|
static boolean enabled() {
|
||||||
|
return ConfigManager.getInstance().dexObfuscate();
|
||||||
|
}
|
||||||
|
|
||||||
static native void init();
|
static native void init();
|
||||||
|
|
||||||
// For module dexes
|
// For module dexes
|
||||||
|
|
|
||||||
|
|
@ -75,4 +75,8 @@ interface ILSPManagerService {
|
||||||
boolean performDexOptMode(String packageName) = 40;
|
boolean performDexOptMode(String packageName) = 40;
|
||||||
|
|
||||||
List<String> getDenyListPackages() = 41;
|
List<String> getDenyListPackages() = 41;
|
||||||
|
|
||||||
|
boolean getDexObfuscate() = 42;
|
||||||
|
|
||||||
|
void setDexObfuscate(boolean enable) = 43;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue