From e2fb9709e4682d3946fca9a3e4083efbc8c812b9 Mon Sep 17 00:00:00 2001 From: solohsu Date: Sat, 16 Mar 2019 14:05:01 +0800 Subject: [PATCH] Ensure necessary system props Some other Magisk modules may override the system props we set, e.g. compiler-filter, which will likely result in boot loops. We PLT hook native getSystemProp implementation methods to make sure the values of related system props are always what we want. Fix #156. --- Core/build.gradle | 2 +- Core/jni/main/Android.mk | 1 + Core/jni/main/native_hook/native_hook.cpp | 2 + Core/jni/main/native_hook/riru_hook.cpp | 82 +++++++++++++++++++ Core/jni/main/native_hook/riru_hook.h | 10 +++ .../common/util_functions.sh | 2 +- Core/template_override/config.sh | 2 +- Core/template_override/module.prop | 4 +- Core/template_override/riru_module.prop | 4 +- .../system/framework/edconfig.dex | 2 +- 10 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 Core/jni/main/native_hook/riru_hook.cpp create mode 100644 Core/jni/main/native_hook/riru_hook.h diff --git a/Core/build.gradle b/Core/build.gradle index f28d6ac5b..77d36d304 100644 --- a/Core/build.gradle +++ b/Core/build.gradle @@ -1,7 +1,7 @@ import org.gradle.internal.os.OperatingSystem; apply plugin: 'com.android.library' -version "v0.3.1.4_beta-SNAPSHOT" +version "v0.3.1.5_beta-SNAPSHOT" extensions["module_name"] = "EdXposed" android { compileSdkVersion 28 diff --git a/Core/jni/main/Android.mk b/Core/jni/main/Android.mk index c7f12670b..08325358c 100644 --- a/Core/jni/main/Android.mk +++ b/Core/jni/main/Android.mk @@ -13,6 +13,7 @@ LOCAL_LDFLAGS := -Wl LOCAL_SRC_FILES:= \ main.cpp \ native_hook/native_hook.cpp \ + native_hook/riru_hook.cpp \ include/misc.cpp \ include/riru.c \ yahfa/HookMain.c \ diff --git a/Core/jni/main/native_hook/native_hook.cpp b/Core/jni/main/native_hook/native_hook.cpp index cb8fb739d..d5823c820 100644 --- a/Core/jni/main/native_hook/native_hook.cpp +++ b/Core/jni/main/native_hook/native_hook.cpp @@ -7,6 +7,7 @@ #include "include/logging.h" #include "native_hook.h" +#include "riru_hook.h" static bool inlineHooksInstalled = false; @@ -272,6 +273,7 @@ void install_inline_hooks() { LOGE("api level not supported: %d, skip", api_level); return; } + install_riru_hooks(); LOGI("using api level %d", api_level); void *whaleHandle = dlopen(kLibWhalePath, RTLD_LAZY | RTLD_GLOBAL); if (!whaleHandle) { diff --git a/Core/jni/main/native_hook/riru_hook.cpp b/Core/jni/main/native_hook/riru_hook.cpp new file mode 100644 index 000000000..4a497c537 --- /dev/null +++ b/Core/jni/main/native_hook/riru_hook.cpp @@ -0,0 +1,82 @@ +// +// Created by solo on 2019/3/16. +// + +#include +#include +#include +#include +#include +#include +#include +#include "riru_hook.h" + +#define PROP_KEY_COMPILER_FILTER "dalvik.vm.dex2oat-filter" +#define PROP_KEY_COMPILER_FLAGS "dalvik.vm.dex2oat-flags" +#define PROP_VALUE_COMPILER_FILTER "quicken" +#define PROP_VALUE_COMPILER_FLAGS "--inline-max-code-units=0" + +#define XHOOK_REGISTER(NAME) \ + if (xhook_register(".*", #NAME, (void*) new_##NAME, (void **) &old_##NAME) == 0) { \ + if (riru_get_version() >= 8) { \ + void *f = riru_get_func(#NAME); \ + if (f != nullptr) { \ + memcpy(&old_##NAME, &f, sizeof(void *)); \ + } \ + riru_set_func(#NAME, (void *) new_##NAME); \ + } \ + } else { \ + LOGE("failed to register riru hook " #NAME "."); \ + } + +#define NEW_FUNC_DEF(ret, func, ...) \ + static ret (*old_##func)(__VA_ARGS__); \ + static ret new_##func(__VA_ARGS__) + +NEW_FUNC_DEF(int, __system_property_get, const char *key, char *value) { + int res = old___system_property_get(key, value); + if (key) { + if (strcmp(PROP_KEY_COMPILER_FILTER, key) == 0) { + strcpy(value, PROP_VALUE_COMPILER_FILTER); + LOGI("system_property_get: %s -> %s", key, value); + } else if (strcmp(PROP_KEY_COMPILER_FLAGS, key) == 0) { + strcpy(value, PROP_VALUE_COMPILER_FLAGS); + LOGI("system_property_get: %s -> %s", key, value); + } + } + return res; +} + +NEW_FUNC_DEF(std::string, + _ZN7android4base11GetPropertyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_, + const std::string &key, const std::string &default_value) { + std::string res = old__ZN7android4base11GetPropertyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_( + key, default_value); + if (strcmp(PROP_KEY_COMPILER_FILTER, key.c_str()) == 0) { + res = PROP_VALUE_COMPILER_FILTER; + LOGI("android::base::GetProperty: %s -> %s", key.c_str(), res.c_str()); + } else if (strcmp(PROP_KEY_COMPILER_FLAGS, key.c_str()) == 0) { + res = PROP_VALUE_COMPILER_FLAGS; + LOGI("android::base::GetProperty: %s -> %s", key.c_str(), res.c_str()); + } + return res; +} + +void install_riru_hooks() { + + LOGI("install riru hook"); + + XHOOK_REGISTER(__system_property_get); + + if (GetAndroidApiLevel() >= ANDROID_P) { + XHOOK_REGISTER( + _ZN7android4base11GetPropertyERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_); + } + + if (xhook_refresh(0) == 0) { + xhook_clear(); + LOGI("riru hooks installed"); + } else { + LOGE("failed to install riru hooks"); + } +} \ No newline at end of file diff --git a/Core/jni/main/native_hook/riru_hook.h b/Core/jni/main/native_hook/riru_hook.h new file mode 100644 index 000000000..29385cd44 --- /dev/null +++ b/Core/jni/main/native_hook/riru_hook.h @@ -0,0 +1,10 @@ +// +// Created by solo on 2019/3/16. +// + +#ifndef EDXPOSED_RIRU_HOOK_H +#define EDXPOSED_RIRU_HOOK_H + +void install_riru_hooks(); + +#endif //EDXPOSED_RIRU_HOOK_H diff --git a/Core/template_override/common/util_functions.sh b/Core/template_override/common/util_functions.sh index 67276981b..d5bc3f8ea 100644 --- a/Core/template_override/common/util_functions.sh +++ b/Core/template_override/common/util_functions.sh @@ -1,6 +1,6 @@ #!/system/bin/sh -EDXP_VERSION="0.3.1.4_beta-SNAPSHOT (3140)" +EDXP_VERSION="0.3.1.5_beta-SNAPSHOT (3150)" ANDROID_SDK=`getprop ro.build.version.sdk` BUILD_DESC=`getprop ro.build.description` PRODUCT=`getprop ro.build.product` diff --git a/Core/template_override/config.sh b/Core/template_override/config.sh index a0170b1dd..d644a3d6f 100644 --- a/Core/template_override/config.sh +++ b/Core/template_override/config.sh @@ -41,7 +41,7 @@ LATESTARTSERVICE=false print_modname() { ui_print "************************************" - ui_print " Riru - Ed Xposed v0.3.1.4 " + ui_print " Riru - Ed Xposed v0.3.1.5 " ui_print "************************************" } diff --git a/Core/template_override/module.prop b/Core/template_override/module.prop index 6e139f04c..0d135f091 100644 --- a/Core/template_override/module.prop +++ b/Core/template_override/module.prop @@ -1,7 +1,7 @@ id=riru_edxposed name=Riru - Ed Xposed -version=v0.3.1.4_beta-SNAPSHOT -versionCode=3140 +version=v0.3.1.5_beta-SNAPSHOT +versionCode=3150 author=solohsu & MlgmXyysd description=Magisk version of Xposed. Require Riru - Core installed. minMagisk=17000 diff --git a/Core/template_override/riru_module.prop b/Core/template_override/riru_module.prop index 92d58ef74..9636ce687 100644 --- a/Core/template_override/riru_module.prop +++ b/Core/template_override/riru_module.prop @@ -1,5 +1,5 @@ name=Ed Xposed -version=v0.3.1.4_beta-SNAPSHOT -versionCode=3140 +version=v0.3.1.5_beta-SNAPSHOT +versionCode=3150 author=solohsu & MlgmXyysd description=Magisk version of Xposed. Require Riru - Core installed. diff --git a/Core/template_override/system/framework/edconfig.dex b/Core/template_override/system/framework/edconfig.dex index b7f9d96d0..12d12e21a 100644 --- a/Core/template_override/system/framework/edconfig.dex +++ b/Core/template_override/system/framework/edconfig.dex @@ -1,4 +1,4 @@ -version=90.0-0.3.1.4-beta-SNAPSHOT +version=90.0-0.3.1.5-beta-SNAPSHOT arch=arm64 minsdk=23 maxsdk=28