diff --git a/.gitmodules b/.gitmodules index 3448c6111..88f350f49 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "edxp-core/src/main/cpp/external/Dobby"] path = edxp-core/src/main/cpp/external/Dobby url = https://github.com/jmpews/Dobby.git +[submodule "apk-parser"] + path = apk-parser + url = https://github.com/jaredrummler/APKParser.git diff --git a/apk-parser b/apk-parser new file mode 160000 index 000000000..4b2590b95 --- /dev/null +++ b/apk-parser @@ -0,0 +1 @@ +Subproject commit 4b2590b959df4d669d1b7db25e97d58344def726 diff --git a/edxp-common/build.gradle b/edxp-common/build.gradle index 3d07b3003..287133790 100644 --- a/edxp-common/build.gradle +++ b/edxp-common/build.gradle @@ -25,6 +25,7 @@ dependencies { api project(':xposed-bridge') compileOnly project(':dexmaker') compileOnly 'com.android.support:support-annotations:28.0.0' + implementation project(':apk-parser:library') } diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java index 9e5310dfe..9af27bd6f 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/_hooker/impl/HandleBindApp.java @@ -12,8 +12,10 @@ import com.elderdrivers.riru.edxp.config.ConfigManager; import com.elderdrivers.riru.edxp.util.Hookers; import com.elderdrivers.riru.edxp.util.Utils; +import com.jaredrummler.apkparser.ApkParser; import java.io.File; +import java.io.IOException; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; @@ -55,15 +57,24 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { String processName = (String) XposedHelpers.getObjectField(bindData, "processName"); - final ApplicationInfo ai = ActivityThread.currentActivityThread().getSystemContext().getPackageManager().getApplicationInfo(appInfo.packageName, PackageManager.GET_META_DATA); + boolean isModule = false; + int xposedminversion = -1; + try { + ApkParser ap = ApkParser.create(new File(appInfo.sourceDir)); + isModule = ap.getApkMeta().metaData.containsKey("xposedmodule"); + if(isModule) + xposedminversion = Integer.parseInt(ap.getApkMeta().metaData.get("xposedminversion")); + } catch (NumberFormatException | IOException e) { + Hookers.logE("ApkParser fails", e); + } - if(ai.metaData.getBoolean("xposedmodule") && ai.metaData.getInt("xposedminversion", -1) > 92) { + if (isModule && xposedminversion > 92) { Utils.logW("New modules detected, hook preferences"); XposedHelpers.findAndHookMethod(ContextImpl.class, "getSharedPreferences", File.class, int.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - String fileName = ((File)param.args[0]).getName(); - File file = new File(ConfigManager.getPrefsPath(ai.packageName), fileName); + String fileName = ((File) param.args[0]).getName(); + File file = new File(ConfigManager.getPrefsPath(appInfo.packageName), fileName); file.createNewFile(); file.setReadable(true, false); param.args[0] = file; diff --git a/edxp-core/src/main/cpp/main/include/config.h b/edxp-core/src/main/cpp/main/include/config.h index 33b70734b..772cfb48c 100644 --- a/edxp-core/src/main/cpp/main/include/config.h +++ b/edxp-core/src/main/cpp/main/include/config.h @@ -37,15 +37,12 @@ inline constexpr bool is64 = Is64(); static const auto kLibArtName = "libart.so"s; static const auto kLibFwName = "libandroidfw.so"s; static const auto kLibSandHookName = "libsandhook.edxp.so"s; - static const auto kLibDlName = "libdl.so"s; - static const auto kLibSandHookNativeName = "libsandhook-native.so"s; static const auto kLibBasePath = LP_SELECT("/system/lib/"s, "/system/lib64/"s); static const auto kLibArtLegacyPath = kLibBasePath + kLibArtName; static const auto kLibSandHookPath = kLibBasePath + kLibSandHookName; - static const auto kLibSandHookNativePath = kLibBasePath + kLibSandHookNativeName; static const auto kLibFwPath = kLibBasePath + kLibFwName; inline constexpr const char *const BoolToString(bool b) { diff --git a/edxp-core/src/main/cpp/main/src/config_manager.cpp b/edxp-core/src/main/cpp/main/src/config_manager.cpp index 1da91d94d..304f19500 100644 --- a/edxp-core/src/main/cpp/main/src/config_manager.cpp +++ b/edxp-core/src/main/cpp/main/src/config_manager.cpp @@ -227,7 +227,8 @@ namespace edxp { if (!app_pkg_name.empty()) scope.emplace(std::move(app_pkg_name)); } - scope.insert(module_pkg_name); // Always add module itself + if(!scope.empty()) + scope.insert(module_pkg_name); // Always add module itself if (IsInstaller(module_pkg_name)) scope.erase("android"); LOGI("scope of %s is:\n%s", module_pkg_name.c_str(), ([&scope = scope]() { std::ostringstream join; diff --git a/edxp-core/template_override/customize.sh b/edxp-core/template_override/customize.sh index ddeccb303..c17bcabd4 100644 --- a/edxp-core/template_override/customize.sh +++ b/edxp-core/template_override/customize.sh @@ -246,7 +246,6 @@ else ui_print "- Extracting arm libraries" extract "$ZIPFILE" 'system/lib/libriru_edxp.so' "$MODPATH" if [[ "${VARIANTS}" == "SandHook" ]]; then - extract "$ZIPFILE" 'system/lib/libsandhook-native.so' "$MODPATH" extract "$ZIPFILE" 'system/lib/libsandhook.edxp.so' "$MODPATH" fi @@ -254,7 +253,6 @@ else ui_print "- Extracting arm64 libraries" extract "$ZIPFILE" 'system/lib64/libriru_edxp.so' "$MODPATH" if [[ "${VARIANTS}" == "SandHook" ]]; then - extract "$ZIPFILE" 'system/lib64/libsandhook-native.so' "$MODPATH" extract "$ZIPFILE" 'system/lib64/libsandhook.edxp.so' "$MODPATH" fi fi diff --git a/edxp-core/template_override/post-fs-data.sh b/edxp-core/template_override/post-fs-data.sh index 9562d6e59..f28c7cebe 100644 --- a/edxp-core/template_override/post-fs-data.sh +++ b/edxp-core/template_override/post-fs-data.sh @@ -55,7 +55,8 @@ sepolicy() { #fi DEFAULT_BASE_PATH="${PATH_PREFIX}${EDXP_MANAGER}" -BASE_PATH="/data/misc/$(cat /data/adb/edxp/misc_path)" +MISC_PATH=$(cat /data/adb/edxp/misc_path) +BASE_PATH="/data/misc/$MISC_PATH" LOG_PATH="${BASE_PATH}/0/log" CONF_PATH="${BASE_PATH}/0/conf" @@ -166,6 +167,6 @@ fi chcon -R u:object_r:system_file:s0 "${MODDIR}" chcon -R ${PATH_CONTEXT} "${LOG_PATH}" -chcon -R u:object_r:magisk_file:s0 $BASE_PATH chown -R ${PATH_OWNER} "${LOG_PATH}" chmod -R 666 "${LOG_PATH}" +[[ -z "$MISC_PATH" ]] && chcon -R u:object_r:magisk_file:s0 "$BASE_PATH" diff --git a/edxp-sandhook/template_override/system/lib/libsandhook-native.so b/edxp-sandhook/template_override/system/lib/libsandhook-native.so deleted file mode 100644 index 34a2ce0fe..000000000 Binary files a/edxp-sandhook/template_override/system/lib/libsandhook-native.so and /dev/null differ diff --git a/edxp-sandhook/template_override/system/lib64/libsandhook-native.so b/edxp-sandhook/template_override/system/lib64/libsandhook-native.so deleted file mode 100644 index 1d64ee534..000000000 Binary files a/edxp-sandhook/template_override/system/lib64/libsandhook-native.so and /dev/null differ diff --git a/edxp-service/src/main/java/com/elderdrivers/riru/edxp/service/PackageReceiver.java b/edxp-service/src/main/java/com/elderdrivers/riru/edxp/service/PackageReceiver.java index e9908f82f..fde8ee099 100644 --- a/edxp-service/src/main/java/com/elderdrivers/riru/edxp/service/PackageReceiver.java +++ b/edxp-service/src/main/java/com/elderdrivers/riru/edxp/service/PackageReceiver.java @@ -98,11 +98,9 @@ private Map loadEnabledModules(int uid) { return result; } - private void updateModuleList(int uid, String packageName) { + private void updateModuleList(int uid) { Map enabledModules = loadEnabledModules(uid); - if (!enabledModules.containsKey(packageName)) return; - try { File moduleListFile = new File(CONFIG_PATH, uid + "/" + MODULES_LIST_FILENAME); moduleListFile.createNewFile(); @@ -157,7 +155,7 @@ public void onReceive(Context context, Intent intent) { for (Object uh : (List) m.invoke(um)) { int uid = (int) uh.getClass().getDeclaredField("id").get(uh); Utils.logI("updating uid: " + uid); - updateModuleList(uid, packageName); + updateModuleList(uid); } Toast.makeText(context, "EdXposed: Updated " + packageName, Toast.LENGTH_SHORT).show(); } catch (Throwable e) { diff --git a/settings.gradle b/settings.gradle index a4cc45acb..3e72f7bce 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':edxp-core', ':xposed-bridge', ':hiddenapi-stubs', ':dexmaker', ':dalvikdx', ':edxp-common', ':edxp-yahfa', ':edxp-sandhook', ':edxp-service' \ No newline at end of file +include ':edxp-core', ':xposed-bridge', ':hiddenapi-stubs', ':dexmaker', ':dalvikdx', ':edxp-common', ':edxp-yahfa', ':edxp-sandhook', ':edxp-service', ':apk-parser:library' \ No newline at end of file diff --git a/xposed-bridge/build.gradle b/xposed-bridge/build.gradle index aa014e994..9ac95a803 100644 --- a/xposed-bridge/build.gradle +++ b/xposed-bridge/build.gradle @@ -43,6 +43,7 @@ preBuild.doLast { } dependencies { + compileOnly project(':apk-parser:library') compileOnly files(project(":dexmaker").tasks.getByName("makeJarRelease").outputs) compileOnly files(project(":hiddenapi-stubs").tasks.getByName("makeStubJar").outputs) } diff --git a/xposed-bridge/src/main/java/de/robv/android/xposed/XSharedPreferences.java b/xposed-bridge/src/main/java/de/robv/android/xposed/XSharedPreferences.java index dea22e89a..d84613ee5 100644 --- a/xposed-bridge/src/main/java/de/robv/android/xposed/XSharedPreferences.java +++ b/xposed-bridge/src/main/java/de/robv/android/xposed/XSharedPreferences.java @@ -11,6 +11,7 @@ import android.util.Log; import com.android.internal.util.XmlUtils; +import com.jaredrummler.apkparser.ApkParser; import org.xmlpull.v1.XmlPullParserException; @@ -72,8 +73,17 @@ public XSharedPreferences(String packageName, String prefFileName) { Set modules = XposedInit.getLoadedModules(); for (String m : modules) { if (m.contains("/" + packageName + "-")) { - PackageInfo packageInfo = ((Context) ActivityThread.currentActivityThread().getSystemContext()).getPackageManager().getPackageArchiveInfo(m, PackageManager.GET_META_DATA); - newModule = packageInfo != null && packageInfo.applicationInfo != null && packageInfo.applicationInfo.metaData.getBoolean("xposedmodule") && packageInfo.applicationInfo.metaData.getInt("xposedminversion", -1) > 92; + boolean isModule = false; + int xposedminversion = -1; + try { + ApkParser ap = ApkParser.create(new File(m)); + isModule = ap.getApkMeta().metaData.containsKey("xposedmodule"); + if(isModule) + xposedminversion = Integer.parseInt(ap.getApkMeta().metaData.get("xposedminversion")); + } catch (NumberFormatException | IOException e) { + Log.w(TAG, "Apk parser fails: " + e); + } + newModule = isModule && xposedminversion > 92; } } if (newModule && XposedInit.prefsBasePath != null) {