From c28c2cb065d40c12b05f86d6775494892d03afca Mon Sep 17 00:00:00 2001 From: solohsu Date: Sun, 10 Mar 2019 20:03:14 +0800 Subject: [PATCH 1/6] Fix inconsistent use_white_list flag Still, app_data_file is not accessible to some process, e.g. bluetooth process on some devices, hence they would get a wrong use_white_list flag. What's worse is that these process cannot know whether they are black/white listed or not. As a workaround we take a black/white list snapshot in zygote. --- .../com/elderdrivers/riru/xposed/Main.java | 7 +- .../proxy/yahfa/BlackWhiteListProxy.java | 30 ++++++-- .../riru/xposed/proxy/yahfa/NormalProxy.java | 4 +- Core/jni/main/inject/config_manager.cpp | 71 +++++++++++++++++-- Core/jni/main/inject/framework_hook.cpp | 4 +- 5 files changed, 99 insertions(+), 17 deletions(-) diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java index 812ae673..5259aca9 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java @@ -17,6 +17,7 @@ import java.util.Arrays; public class Main implements KeepAll { public static String appDataDir = ""; + public static String niceName = ""; public static String appProcessName = ""; public static long closedFdTable = 0; private static String forkAndSpecializePramsStr = ""; @@ -54,13 +55,13 @@ public class Main implements KeepAll { } } - public static void forkAndSpecializePost(int pid, String appDataDir) { + public static void forkAndSpecializePost(int pid, String appDataDir, String niceName) { if (pid == 0) { Utils.logD(forkAndSpecializePramsStr + " = " + Process.myPid()); if (isBlackWhiteListEnabled()) { - BlackWhiteListProxy.forkAndSpecializePost(pid, appDataDir); + BlackWhiteListProxy.forkAndSpecializePost(pid, appDataDir, niceName); } else { - NormalProxy.forkAndSpecializePost(pid, appDataDir); + NormalProxy.forkAndSpecializePost(pid, appDataDir, niceName); } } else { // in zygote process, res is child zygote pid diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java index 356c830a..258bba99 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java @@ -1,9 +1,13 @@ package com.elderdrivers.riru.xposed.proxy.yahfa; +import android.text.TextUtils; + import com.elderdrivers.riru.xposed.Main; import com.elderdrivers.riru.xposed.config.ConfigManager; import com.elderdrivers.riru.xposed.entry.Router; import com.elderdrivers.riru.xposed.util.PrebuiltMethodsDeopter; +import com.elderdrivers.riru.xposed.util.ProcessUtils; +import com.elderdrivers.riru.xposed.util.Utils; import static com.elderdrivers.riru.xposed.Main.isAppNeedHook; import static com.elderdrivers.riru.xposed.util.FileUtils.getDataPathPrefix; @@ -25,7 +29,7 @@ import static com.elderdrivers.riru.xposed.util.FileUtils.getDataPathPrefix; * * for all child processes of both main zygote and secondary zygote * 1) do the same things pre-forking first child process * 2. Dynamic mode: - * to be continued + * to be continued */ public class BlackWhiteListProxy { @@ -43,8 +47,8 @@ public class BlackWhiteListProxy { onForkPreForNonDynamicMode(false); } - public static void forkAndSpecializePost(int pid, String appDataDir) { - onForkPostCommon(false, appDataDir); + public static void forkAndSpecializePost(int pid, String appDataDir, String niceName) { + onForkPostCommon(false, appDataDir, niceName); } public static void forkSystemServerPre(int uid, int gid, int[] gids, int debugFlags, @@ -60,7 +64,7 @@ public class BlackWhiteListProxy { } public static void forkSystemServerPost(int pid) { - onForkPostCommon(true, getDataPathPrefix() + "android"); + onForkPostCommon(true, getDataPathPrefix() + "android", "system_server"); } /** @@ -79,10 +83,11 @@ public class BlackWhiteListProxy { Router.loadModulesSafely(true); } - private static void onForkPostCommon(boolean isSystemServer, String appDataDir) { + private static void onForkPostCommon(boolean isSystemServer, String appDataDir, String niceName) { Main.appDataDir = appDataDir; + Main.niceName = niceName; Router.onEnterChildProcess(); - if (!isAppNeedHook(Main.appDataDir)) { + if (!checkNeedHook(appDataDir, niceName)) { // if is blacklisted, just stop here return; } @@ -96,4 +101,17 @@ public class BlackWhiteListProxy { Router.loadModulesSafely(false); } } + + private static boolean checkNeedHook(String appDataDir, String niceName) { + boolean needHook; + if (TextUtils.isEmpty(appDataDir)) { + Utils.logE("niceName:" + niceName + ", procName:" + + ProcessUtils.getCurrentProcessName() + ", appDataDir is null, blacklisted!"); + needHook = false; + } else { + // FIXME some process cannot read app_data_file because of MLS, e.g. bluetooth + needHook = isAppNeedHook(appDataDir); + } + return needHook; + } } diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/NormalProxy.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/NormalProxy.java index 71679a41..51ee8eb7 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/NormalProxy.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/NormalProxy.java @@ -28,9 +28,10 @@ public class NormalProxy { } } - public static void forkAndSpecializePost(int pid, String appDataDir) { + public static void forkAndSpecializePost(int pid, String appDataDir, String niceName) { // TODO consider processes without forkAndSpecializePost called Main.appDataDir = appDataDir; + Main.niceName = niceName; Router.prepare(false); Router.reopenFilesIfNeeded(); Router.onEnterChildProcess(); @@ -58,6 +59,7 @@ public class NormalProxy { public static void forkSystemServerPost(int pid) { // in system_server process Main.appDataDir = getDataPathPrefix() + "android"; + Main.niceName = "system_server"; Router.prepare(true); Router.reopenFilesIfNeeded(); Router.onEnterChildProcess(); diff --git a/Core/jni/main/inject/config_manager.cpp b/Core/jni/main/inject/config_manager.cpp index af4476d7..f1e1074f 100644 --- a/Core/jni/main/inject/config_manager.cpp +++ b/Core/jni/main/inject/config_manager.cpp @@ -3,6 +3,7 @@ // #include +#include #include #include #include @@ -10,10 +11,14 @@ #include #include #include + #include #include +#include #include "config_manager.h" +using namespace std; + #define PRIMARY_INSTALLER_PKG_NAME "com.solohsu.android.edxp.manager" #define SECONDARY_INSTALLER_PKG_NAME "org.meowcat.edxposed.manager" #define LEGACY_INSTALLER_PKG_NAME "de.robv.android.xposed.installer" @@ -22,6 +27,7 @@ static bool use_prot_storage = GetAndroidApiLevel() >= ANDROID_N; static const char *data_path_prefix = use_prot_storage ? "/data/user_de/0/" : "/data/user/0/"; static const char *config_path_tpl = "%s/%s/conf/%s"; static char data_test_path[PATH_MAX]; +static char base_config_path[PATH_MAX]; static char blacklist_path[PATH_MAX]; static char whitelist_path[PATH_MAX]; static char use_whitelist_path[PATH_MAX]; @@ -34,6 +40,10 @@ static bool black_white_list_enabled = false; static bool dynamic_modules_enabled = false; static bool deopt_boot_image_enabled = false; static bool inited = false; +// snapshot at boot +static bool use_white_list_snapshot = false; +static vector white_list_default; +static vector black_list_default; static const char *get_installer_package_name() { snprintf(data_test_path, PATH_MAX, config_path_tpl, data_path_prefix, @@ -61,9 +71,38 @@ static const char *get_installer_package_name() { return PRIMARY_INSTALLER_PKG_NAME; } +static void snapshotBlackWhiteList() { + DIR *dir; + struct dirent *dent; + dir = opendir(whitelist_path); + if (dir != nullptr) { + while ((dent = readdir(dir)) != nullptr) { + if (dent->d_type == DT_REG) { + const char *fileName = dent->d_name; + LOGI("whitelist: %s", fileName); + white_list_default.emplace_back(fileName); + } + } + closedir(dir); + } + dir = opendir(blacklist_path); + if (dir != nullptr) { + while ((dent = readdir(dir)) != nullptr) { + if (dent->d_type == DT_REG) { + const char *fileName = dent->d_name; + LOGI("blacklist: %s", fileName); + black_list_default.emplace_back(fileName); + } + } + closedir(dir); + } +} + static void init_once() { if (!inited) { installer_package_name = get_installer_package_name(); + snprintf(base_config_path, PATH_MAX, config_path_tpl, data_path_prefix, + installer_package_name, ""); snprintf(blacklist_path, PATH_MAX, config_path_tpl, data_path_prefix, installer_package_name, "blacklist/"); snprintf(whitelist_path, PATH_MAX, config_path_tpl, data_path_prefix, @@ -78,9 +117,15 @@ static void init_once() { installer_package_name, "deoptbootimage"); dynamic_modules_enabled = access(dynamic_modules_path, F_OK) == 0; black_white_list_enabled = access(black_white_list_path, F_OK) == 0; + // use_white_list snapshot + use_white_list_snapshot = access(use_whitelist_path, F_OK) == 0; deopt_boot_image_enabled = access(deopt_boot_image_path, F_OK) == 0; - LOGI("black/white list mode: %d", black_white_list_enabled); + LOGI("black/white list mode: %d, using whitelist: %d", black_white_list_enabled, + use_white_list_snapshot); LOGI("dynamic modules mode: %d", dynamic_modules_enabled); + if (black_white_list_enabled) { + snapshotBlackWhiteList(); + } inited = true; } } @@ -92,12 +137,16 @@ bool is_app_need_hook(JNIEnv *env, jclass, jstring appDataDir) { if (!black_white_list_enabled) { return true; } - bool use_white_list = access(use_whitelist_path, F_OK) == 0; - if (!appDataDir) { - LOGE("appDataDir is null"); - return !use_white_list; - } + const char *app_data_dir = env->GetStringUTFChars(appDataDir, nullptr); + bool can_access_app_data = access(base_config_path, F_OK) == 0; + bool use_white_list; + if (can_access_app_data) { + use_white_list = access(use_whitelist_path, F_OK) == 0; + } else { + LOGE("can't access config path, using snapshot use_white_list: %s", app_data_dir); + use_white_list = use_white_list_snapshot; + } int user = 0; if (sscanf(app_data_dir, "/data/%*[^/]/%d/%s", &user, package_name) != 2) { if (sscanf(app_data_dir, "/data/%*[^/]/%s", package_name) != 1) { @@ -115,6 +164,11 @@ bool is_app_need_hook(JNIEnv *env, jclass, jstring appDataDir) { return true; } if (use_white_list) { + if (!can_access_app_data) { + LOGE("can't access config path, using snapshot white list: %s", app_data_dir); + return find(white_list_default.begin(), white_list_default.end(), package_name) != + white_list_default.end(); + } char path[PATH_MAX]; snprintf(path, PATH_MAX, "%s%s", whitelist_path, package_name); bool res = access(path, F_OK) == 0; @@ -122,6 +176,11 @@ bool is_app_need_hook(JNIEnv *env, jclass, jstring appDataDir) { env->ReleaseStringUTFChars(appDataDir, app_data_dir); return res; } else { + if (!can_access_app_data) { + LOGE("can't access config path, using snapshot black list: %s", app_data_dir); + return !(find(black_list_default.begin(), black_list_default.end(), package_name) != + black_list_default.end()); + } char path[PATH_MAX]; snprintf(path, PATH_MAX, "%s%s", blacklist_path, package_name); bool res = access(path, F_OK) != 0; diff --git a/Core/jni/main/inject/framework_hook.cpp b/Core/jni/main/inject/framework_hook.cpp index bd6392d9..5fd8eb6f 100644 --- a/Core/jni/main/inject/framework_hook.cpp +++ b/Core/jni/main/inject/framework_hook.cpp @@ -11,6 +11,7 @@ static jclass sEntryClass; static jstring sAppDataDir; +static jstring sNiceName; void prepareJavaEnv(JNIEnv *env) { loadDexAndInit(env, INJECT_DEX_PATH); @@ -81,6 +82,7 @@ void onNativeForkAndSpecializePre(JNIEnv *env, jclass clazz, jstring instructionSet, jstring appDataDir) { sAppDataDir = appDataDir; + sNiceName = se_name; bool is_black_white_list_mode = is_black_white_list_enabled(); bool is_dynamic_modules_mode = is_dynamic_modules_enabled(); if (is_black_white_list_mode && is_dynamic_modules_mode) { @@ -98,7 +100,7 @@ void onNativeForkAndSpecializePre(JNIEnv *env, jclass clazz, int onNativeForkAndSpecializePost(JNIEnv *env, jclass clazz, jint res) { if (res == 0) { prepareJavaEnv(env); - findAndCall(env, "forkAndSpecializePost", "(ILjava/lang/String;)V", res, sAppDataDir); + findAndCall(env, "forkAndSpecializePost", "(ILjava/lang/String;Ljava/lang/String;)V", res, sAppDataDir, sNiceName); } else { // in zygote process, res is child zygote pid // don't print log here, see https://github.com/RikkaApps/Riru/blob/77adfd6a4a6a81bfd20569c910bc4854f2f84f5e/riru-core/jni/main/jni_native_method.cpp#L55-L66 From 47c500b96ded4da92aa59b7b8336ba556afa3716 Mon Sep 17 00:00:00 2001 From: solohsu Date: Sun, 10 Mar 2019 22:34:51 +0800 Subject: [PATCH 2/6] Clean up loaded module callbacks for blacklisted app Otherwise a few applications would get stuck at launch screen, for unknown reason. --- .../riru/xposed/proxy/yahfa/BlackWhiteListProxy.java | 12 ++++++++++++ .../java/de/robv/android/xposed/XposedBridge.java | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java index 258bba99..7b3ec5c9 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java @@ -9,6 +9,8 @@ import com.elderdrivers.riru.xposed.util.PrebuiltMethodsDeopter; import com.elderdrivers.riru.xposed.util.ProcessUtils; import com.elderdrivers.riru.xposed.util.Utils; +import de.robv.android.xposed.XposedBridge; + import static com.elderdrivers.riru.xposed.Main.isAppNeedHook; import static com.elderdrivers.riru.xposed.util.FileUtils.getDataPathPrefix; @@ -80,6 +82,7 @@ public class BlackWhiteListProxy { // because installed hooks would be propagated to all child processes of zygote Router.startWorkAroundHook(); // loadModules once for all child processes of zygote + // TODO maybe just save initZygote callbacks and call them when whitelisted process forked? Router.loadModulesSafely(true); } @@ -112,6 +115,15 @@ public class BlackWhiteListProxy { // FIXME some process cannot read app_data_file because of MLS, e.g. bluetooth needHook = isAppNeedHook(appDataDir); } + if (!needHook) { + // clean up the scene + onBlackListed(); + } return needHook; } + + private static void onBlackListed() { + XposedBridge.clearLoadedPackages(); + XposedBridge.clearInitPackageResources(); + } } diff --git a/Bridge/src/main/java/de/robv/android/xposed/XposedBridge.java b/Bridge/src/main/java/de/robv/android/xposed/XposedBridge.java index 851d12ab..82972fed 100644 --- a/Bridge/src/main/java/de/robv/android/xposed/XposedBridge.java +++ b/Bridge/src/main/java/de/robv/android/xposed/XposedBridge.java @@ -393,6 +393,12 @@ public final class XposedBridge { // } } + public static void clearInitPackageResources() { + synchronized (sInitPackageResourcesCallbacks) { + sInitPackageResourcesCallbacks.clear(); + } + } + /** * Intercept every call to the specified method and call a handler function instead. * @param method The method to intercept From 2c49377ba2b3ccb4e74f7ff2d717544b22080c52 Mon Sep 17 00:00:00 2001 From: solohsu Date: Mon, 11 Mar 2019 00:07:41 +0800 Subject: [PATCH 3/6] Use logcat -f to save logs --- Core/template_override/common/post-fs-data.sh | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/Core/template_override/common/post-fs-data.sh b/Core/template_override/common/post-fs-data.sh index 6ea04503..e8000ed4 100644 --- a/Core/template_override/common/post-fs-data.sh +++ b/Core/template_override/common/post-fs-data.sh @@ -33,13 +33,13 @@ msg[5]="Mitsuha. Mitsuha. Mitsuha, your name is Mitsuha..." msg[6]="Someone dear to me. I don't want to forget. I shouldn't forget!" time=$(date +%Y-%m-%d-%H-%M-%S) android_sdk=`getprop ro.build.version.sdk` -if [ ${android_sdk} -ge 24 ] +if [[ ${android_sdk} -ge 24 ]] then path=/data/user_de/0/com.solohsu.android.edxp.manager/log else path=/data/data/com.solohsu.android.edxp.manager/log fi -file=$path/error.log +file=${path}/error.log num=$(($RANDOM+100000000)) rand=$(($num%7)) build_desc=`getprop ro.build.description` @@ -51,24 +51,26 @@ arch=`getprop ro.product.cpu.abi` device=`getprop ro.product.device` android=`getprop ro.build.version.release` build=`getprop ro.build.id` -mkdir -p $path -rm -rf $file -touch $file -echo "--------- beginning of head">>$file -echo "EdXposed Log">>$file -echo "Powered by Log Catcher">>$file -echo "QQ chat group 855219808">>$file -echo ${msg[$rand]}>>$file -echo "--------- beginning of system info">>$file -echo "Android version: ${android}">>$file -echo "Android sdk: ${android_sdk}">>$file -echo "Android build: ${build}">>$file -echo "Fingerprint: ${fingerprint}">>$file -echo "ROM build description: ${build_desc}">>$file -echo "EdXposed Version: ${edxp_ver}">>$file -echo "Architecture: ${arch}">>$file -echo "Device: ${device}">>$file -echo "Manufacturer: ${manufacturer}">>$file -echo "Brand: ${brand}">>$file -echo "Product: ${product}">>$file -logcat *:V logcatcher-xposed-mlgmxyysd:S|grep -i "EdXposed-">>$file & +mkdir -p ${path} +rm -rf ${file} +touch ${file} +chmod 755 ${file} +echo "--------- beginning of head">>${file} +echo "EdXposed Log">>${file} +echo "Powered by Log Catcher">>${file} +echo "QQ chat group 855219808">>${file} +echo ${msg[$rand]}>>${file} +echo "--------- beginning of system info">>${file} +echo "Android version: ${android}">>${file} +echo "Android sdk: ${android_sdk}">>${file} +echo "Android build: ${build}">>${file} +echo "Fingerprint: ${fingerprint}">>${file} +echo "ROM build description: ${build_desc}">>${file} +echo "EdXposed Version: ${edxp_ver}">>${file} +echo "Architecture: ${arch}">>${file} +echo "Device: ${device}">>${file} +echo "Manufacturer: ${manufacturer}">>${file} +echo "Brand: ${brand}">>${file} +echo "Product: ${product}">>${file} +logcat -f ${file} *:S logcatcher-xposed-mlgmxyysd:S EdXposed-Fwk:V EdXposed-dexmaker:V XSharedPreferences:V EdXposed-Bridge:V EdXposed-YAHFA:V EdXposed-Core-Native:V xhook:V EdXposed-Manager:V Riru:V RiruManager:V XposedInstaller:V & + From 39109e27f147251effd665e023f99e2a80bf5c7f Mon Sep 17 00:00:00 2001 From: solohsu Date: Mon, 11 Mar 2019 00:09:13 +0800 Subject: [PATCH 4/6] Bump version --- Core/build.gradle | 2 +- Core/template_override/common/post-fs-data.sh | 2 +- Core/template_override/config.sh | 2 +- Core/template_override/module.prop | 4 ++-- Core/template_override/riru_module.prop | 4 ++-- Core/template_override/system/framework/edconfig.dex | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Core/build.gradle b/Core/build.gradle index af083cec..0fa1f792 100644 --- a/Core/build.gradle +++ b/Core/build.gradle @@ -1,5 +1,5 @@ apply plugin: 'com.android.library' -version "v0.3.0.0_beta3-SNAPSHOT" +version "v0.3.1.0_beta-SNAPSHOT" extensions["module_name"] = "EdXposed" android { compileSdkVersion 28 diff --git a/Core/template_override/common/post-fs-data.sh b/Core/template_override/common/post-fs-data.sh index e8000ed4..14247334 100644 --- a/Core/template_override/common/post-fs-data.sh +++ b/Core/template_override/common/post-fs-data.sh @@ -7,7 +7,7 @@ MODDIR=${0%/*} # More info in the main Magisk thread # EdXposed Version -edxp_ver="0.3.0.0_beta3-SNAPSHOT" +edxp_ver="0.3.1.0_beta-SNAPSHOT (3100)" # necessary for using mmap in system_server process supolicy --live "allow system_server system_server process {execmem}" diff --git a/Core/template_override/config.sh b/Core/template_override/config.sh index 78b03acd..dc435961 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.0.0 " + ui_print " Riru - Ed Xposed v0.3.1.0 " ui_print "************************************" } diff --git a/Core/template_override/module.prop b/Core/template_override/module.prop index 3042f366..9e27bb9e 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.0.0_beta3-SNAPSHOT -versionCode=3003 +version=v0.3.1.0_beta-SNAPSHOT +versionCode=3100 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 0a12b212..99078bcc 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.0.0_beta3-SNAPSHOT -versionCode=3003 +version=v0.3.1.0_beta-SNAPSHOT +versionCode=3100 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 33b6dbe2..ff433ea6 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.0.0-beta3-SNAPSHOT +version=90.0-0.3.1.0-beta-SNAPSHOT arch=arm64 minsdk=23 maxsdk=28 From 3097077261af62a042eacbfa0fbae45242135b26 Mon Sep 17 00:00:00 2001 From: solohsu Date: Mon, 11 Mar 2019 00:32:38 +0800 Subject: [PATCH 5/6] Fix incomplete logs --- Core/template_override/common/post-fs-data.sh | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Core/template_override/common/post-fs-data.sh b/Core/template_override/common/post-fs-data.sh index 14247334..ec05cc91 100644 --- a/Core/template_override/common/post-fs-data.sh +++ b/Core/template_override/common/post-fs-data.sh @@ -24,14 +24,6 @@ supolicy --live "attradd {system_app platform_app} mlstrustedsubject" supolicy --live "allow zygote apk_data_file * *" # beginning of Log Catcher -msg[0]="Now just a little more only just a little more..." -msg[1]="It's not a right that I'm due, my duty that is must have been kept..." -msg[2]="Since one day you will disappear, I'll keep every part of you..." -msg[3]="Yes we are time fliers scaling the walls of time climbers, tired of playing hide and seek with time..." -msg[4]="Wherever you are in the world, I'll search for you..." -msg[5]="Mitsuha. Mitsuha. Mitsuha, your name is Mitsuha..." -msg[6]="Someone dear to me. I don't want to forget. I shouldn't forget!" -time=$(date +%Y-%m-%d-%H-%M-%S) android_sdk=`getprop ro.build.version.sdk` if [[ ${android_sdk} -ge 24 ]] then @@ -40,8 +32,6 @@ else path=/data/data/com.solohsu.android.edxp.manager/log fi file=${path}/error.log -num=$(($RANDOM+100000000)) -rand=$(($num%7)) build_desc=`getprop ro.build.description` product=`getprop ro.build.product` manufacturer=`getprop ro.product.manufacturer` @@ -59,7 +49,6 @@ echo "--------- beginning of head">>${file} echo "EdXposed Log">>${file} echo "Powered by Log Catcher">>${file} echo "QQ chat group 855219808">>${file} -echo ${msg[$rand]}>>${file} echo "--------- beginning of system info">>${file} echo "Android version: ${android}">>${file} echo "Android sdk: ${android_sdk}">>${file} From bbd2f77c9e5938c86212c7e658f5a7710fd7144c Mon Sep 17 00:00:00 2001 From: solohsu Date: Mon, 11 Mar 2019 02:50:14 +0800 Subject: [PATCH 6/6] Remove redundant modules loading --- .../com/elderdrivers/riru/xposed/Main.java | 4 ++-- .../riru/xposed/entry/Router.java | 17 +------------- .../proxy/yahfa/BlackWhiteListProxy.java | 9 +++++--- .../riru/xposed/proxy/yahfa/NormalProxy.java | 12 +++++----- .../de/robv/android/xposed/XposedInit.java | 12 +++++----- Core/jni/main/java_hook/java_hook.cpp | 23 +++++++++++-------- 6 files changed, 34 insertions(+), 43 deletions(-) diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java index 5259aca9..0ac415f4 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java @@ -122,9 +122,9 @@ public class Main implements KeepAll { // prevent from fatal error caused by holding not whitelisted file descriptors when forking zygote // https://github.com/rovo89/Xposed/commit/b3ba245ad04cd485699fb1d2ebde7117e58214ff - public static native long closeFilesBeforeForkNative(); + public static native void closeFilesBeforeForkNative(); - public static native void reopenFilesAfterForkNative(long fdTable); + public static native void reopenFilesAfterForkNative(); public static native void deoptMethodNative(Object object); diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/entry/Router.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/entry/Router.java index f8f7ed8c..5510caa9 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/entry/Router.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/entry/Router.java @@ -2,7 +2,6 @@ package com.elderdrivers.riru.xposed.entry; import android.text.TextUtils; -import com.elderdrivers.riru.xposed.Main; import com.elderdrivers.riru.xposed.core.HookMain; import com.elderdrivers.riru.xposed.dexmaker.DynamicBridge; import com.elderdrivers.riru.xposed.entry.bootstrap.AppBootstrapHookInfo; @@ -52,25 +51,11 @@ public class Router { } public static void loadModulesSafely(boolean isInZygote) { - boolean loadedByMe; try { // FIXME some coredomain app can't reading modules.list - loadedByMe = XposedInit.loadModules(); + XposedInit.loadModules(isInZygote); } catch (Exception exception) { Utils.logE("error loading module list", exception); - // return true in case there are files opened... - loadedByMe = true; - } - // at last close all fds - if (isInZygote && loadedByMe) { - Main.closedFdTable = Main.closeFilesBeforeForkNative(); - } - } - - public static void reopenFilesIfNeeded() { - long closedFdTable = Main.closedFdTable; - if (closedFdTable != 0) { - Main.reopenFilesAfterForkNative(closedFdTable); } } diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java index 7b3ec5c9..c0c5ab1b 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/BlackWhiteListProxy.java @@ -84,21 +84,24 @@ public class BlackWhiteListProxy { // loadModules once for all child processes of zygote // TODO maybe just save initZygote callbacks and call them when whitelisted process forked? Router.loadModulesSafely(true); + Main.closeFilesBeforeForkNative(); } private static void onForkPostCommon(boolean isSystemServer, String appDataDir, String niceName) { Main.appDataDir = appDataDir; Main.niceName = niceName; + final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled(); + ConfigManager.setDynamicModulesMode(isDynamicModulesMode); Router.onEnterChildProcess(); + if (!isDynamicModulesMode) { + Main.reopenFilesAfterForkNative(); + } if (!checkNeedHook(appDataDir, niceName)) { // if is blacklisted, just stop here return; } - final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled(); - ConfigManager.setDynamicModulesMode(isDynamicModulesMode); Router.prepare(isSystemServer); PrebuiltMethodsDeopter.deoptBootMethods(); - Router.reopenFilesIfNeeded(); Router.installBootstrapHooks(isSystemServer); if (isDynamicModulesMode) { Router.loadModulesSafely(false); diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/NormalProxy.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/NormalProxy.java index 51ee8eb7..b60e9e0c 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/NormalProxy.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/proxy/yahfa/NormalProxy.java @@ -22,10 +22,9 @@ public class NormalProxy { PrebuiltMethodsDeopter.deoptBootMethods(); // do it once for secondary zygote // install bootstrap hooks for secondary zygote Router.installBootstrapHooks(false); - if (Main.closedFdTable == 0) { - // only load modules for secondary zygote - Router.loadModulesSafely(true); - } + // only load modules for secondary zygote + Router.loadModulesSafely(true); + Main.closeFilesBeforeForkNative(); } public static void forkAndSpecializePost(int pid, String appDataDir, String niceName) { @@ -33,7 +32,7 @@ public class NormalProxy { Main.appDataDir = appDataDir; Main.niceName = niceName; Router.prepare(false); - Router.reopenFilesIfNeeded(); + Main.reopenFilesAfterForkNative(); Router.onEnterChildProcess(); // load modules for each app process on its forked if dynamic modules mode is on Router.loadModulesSafely(false); @@ -54,6 +53,7 @@ public class NormalProxy { // because if not global hooks installed in initZygote might not be // propagated to processes not forked via forkAndSpecialize Router.loadModulesSafely(true); + Main.closeFilesBeforeForkNative(); } public static void forkSystemServerPost(int pid) { @@ -61,7 +61,7 @@ public class NormalProxy { Main.appDataDir = getDataPathPrefix() + "android"; Main.niceName = "system_server"; Router.prepare(true); - Router.reopenFilesIfNeeded(); + Main.reopenFilesAfterForkNative(); Router.onEnterChildProcess(); // reload module list if dynamic mode is on Router.loadModulesSafely(false); diff --git a/Bridge/src/main/java/de/robv/android/xposed/XposedInit.java b/Bridge/src/main/java/de/robv/android/xposed/XposedInit.java index 1e917390..20700ebb 100644 --- a/Bridge/src/main/java/de/robv/android/xposed/XposedInit.java +++ b/Bridge/src/main/java/de/robv/android/xposed/XposedInit.java @@ -88,10 +88,11 @@ public final class XposedInit { */ private static volatile AtomicBoolean modulesLoaded = new AtomicBoolean(false); - public static boolean loadModules() throws IOException { - if (!modulesLoaded.compareAndSet(false, true) - && !ConfigManager.isDynamicModulesMode()) { - return false; + public static void loadModules(boolean isInZygote) throws IOException { + boolean hasLoaded = !modulesLoaded.compareAndSet(false, true); + // dynamic module list mode doesn't apply to loading in zygote + if (hasLoaded && (isInZygote || !ConfigManager.isDynamicModulesMode())) { + return; } // FIXME module list is cleared but never could be reload again when using dynamic-module-list under multi-user environment XposedBridge.clearLoadedPackages(); @@ -99,7 +100,7 @@ public final class XposedInit { BaseService service = SELinuxHelper.getAppDataFileService(); if (!service.checkFileExists(filename)) { Log.e(TAG, "Cannot load any modules because " + filename + " was not found"); - return false; + return; } ClassLoader topClassLoader = XposedBridge.BOOTCLASSLOADER; @@ -115,7 +116,6 @@ public final class XposedInit { loadModule(apk, topClassLoader); } apks.close(); - return true; } diff --git a/Core/jni/main/java_hook/java_hook.cpp b/Core/jni/main/java_hook/java_hook.cpp index 8cb0a7b0..8841acaa 100644 --- a/Core/jni/main/java_hook/java_hook.cpp +++ b/Core/jni/main/java_hook/java_hook.cpp @@ -20,18 +20,21 @@ jobject gInjectDexClassLoader; static bool isInited = false; -jlong closeFilesBeforeForkNative(JNIEnv *, jclass) { - return reinterpret_cast(FileDescriptorTable::Create()); +static FileDescriptorTable *gClosedFdTable = nullptr; + +void closeFilesBeforeForkNative(JNIEnv *, jclass) { + // FIXME what if gClosedFdTable is not null + gClosedFdTable = FileDescriptorTable::Create(); } -void reopenFilesAfterForkNative(JNIEnv *, jclass, jlong fdTable) { - if (fdTable == 0) { - LOGE("fdTable is null when reopening files"); +void reopenFilesAfterForkNative(JNIEnv *, jclass) { + if (!gClosedFdTable) { + LOGE("gClosedFdTable is null when reopening files"); return; } - auto *closedFdTable = reinterpret_cast(fdTable); - closedFdTable->Reopen(); - delete closedFdTable; + gClosedFdTable->Reopen(); + delete gClosedFdTable; + gClosedFdTable = nullptr; } jlong suspendAllThreads(JNIEnv *, jclass) { @@ -90,10 +93,10 @@ static JNINativeMethod hookMethods[] = { "getInstallerPkgName", "()Ljava/lang/String;", (void *) get_installer_pkg_name }, { - "closeFilesBeforeForkNative", "()J", (void *) closeFilesBeforeForkNative + "closeFilesBeforeForkNative", "()V", (void *) closeFilesBeforeForkNative }, { - "reopenFilesAfterForkNative", "(J)V", (void *) reopenFilesAfterForkNative + "reopenFilesAfterForkNative", "()V", (void *) reopenFilesAfterForkNative }, { "deoptMethodNative", "(Ljava/lang/Object;)V", (void *) deoptimize_method