From 38fa62bfeaa0486dbceb6e381dab00b3029721c8 Mon Sep 17 00:00:00 2001 From: Nullptr Date: Wed, 24 Aug 2022 15:49:04 +0800 Subject: [PATCH] Fix #172 --- build.gradle.kts | 2 +- .../java/icu/nullptr/hidemyapplist/common/Constants.java | 3 +++ .../java/icu/nullptr/hidemyapplist/xposed/BridgeService.kt | 3 ++- .../main/java/icu/nullptr/hidemyapplist/xposed/Utils.kt | 7 +++++++ .../nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt | 6 +++++- .../nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt | 6 +++++- .../nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt | 6 +++++- 7 files changed, 28 insertions(+), 5 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1b2d14a..33b258c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,7 @@ val minSdkVer by extra(24) val targetSdkVer by extra(33) val appVerName by extra("3.0.0") -val serviceVerCode by extra(82) +val serviceVerCode by extra(83) val minBackupVerCode by extra(65) val androidSourceCompatibility = JavaVersion.VERSION_11 diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/Constants.java b/common/src/main/java/icu/nullptr/hidemyapplist/common/Constants.java index dad6f7d..8c61e1a 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/Constants.java +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/Constants.java @@ -3,6 +3,7 @@ package icu.nullptr.hidemyapplist.common; import java.util.Set; public class Constants { + public static final String APP_PACKAGE_NAME = "com.tsng.hidemyapplist"; public static final String CLASS_PMS = "com.android.server.pm.PackageManagerService"; public static final String[] CLASS_EXT_PMS = { @@ -14,6 +15,8 @@ public class Constants { public static final int TRANSACTION = 'H' << 24 | 'M' << 16 | 'A' << 8 | 'D'; public static final int ACTION_GET_BINDER = 1; + public static final int UID_SYSTEM = 1000; + public static final Set packagesShouldNotHide = Set.of( "android", "android.media", diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/BridgeService.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/BridgeService.kt index dc1d816..12230fb 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/BridgeService.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/BridgeService.kt @@ -8,6 +8,7 @@ import com.github.kyuubiran.ezxhelper.utils.argTypes import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.github.kyuubiran.ezxhelper.utils.method import com.github.kyuubiran.ezxhelper.utils.staticMethod +import icu.nullptr.hidemyapplist.common.BuildConfig import icu.nullptr.hidemyapplist.common.Constants object BridgeService { @@ -17,7 +18,7 @@ object BridgeService { private var appUid = 0 fun start(pms: IPackageManager) { - logI(TAG, "Initialize HMAService") + logI(TAG, "Initialize HMAService - Version ${BuildConfig.SERVICE_VERSION}") val service = HMAService(pms) appUid = Utils.getPackageUidCompat(service.pms, Constants.APP_PACKAGE_NAME, 0, 0) logD(TAG, "Client uid: $appUid") diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/Utils.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/Utils.kt index f5560b9..0f49f74 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/Utils.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/Utils.kt @@ -33,6 +33,13 @@ object Utils { return this.invokeMethodAutoAs("getNameForUid", Binder.getCallingUid()) } + fun binderLocalScope(block: () -> T): T { + val identity = Binder.clearCallingIdentity() + val result = block() + Binder.restoreCallingIdentity(identity) + return result + } + fun getPackageNameFromPackageSettings(packageSettings: Any): String { return with(packageSettings.toString()) { substring(lastIndexOf(' ') + 1, lastIndexOf('/')) diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt index 2c6fb8f..d0e993f 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt @@ -5,6 +5,7 @@ import android.os.Build import com.github.kyuubiran.ezxhelper.utils.findMethod import com.github.kyuubiran.ezxhelper.utils.hookBefore import de.robv.android.xposed.XC_MethodHook +import icu.nullptr.hidemyapplist.common.Constants import icu.nullptr.hidemyapplist.xposed.HMAService import icu.nullptr.hidemyapplist.xposed.Utils import icu.nullptr.hidemyapplist.xposed.logE @@ -26,7 +27,10 @@ class PmsHookTarget28(private val service: HMAService) : IFrameworkHook { }.hookBefore { param -> runCatching { val callingUid = param.args[1] as Int - val callingApps = service.pms.getPackagesForUid(callingUid) ?: return@hookBefore + if (callingUid == Constants.UID_SYSTEM) return@hookBefore + val callingApps = Utils.binderLocalScope { + service.pms.getPackagesForUid(callingUid) + } ?: return@hookBefore val targetApp = Utils.getPackageNameFromPackageSettings(param.args[0]) for (caller in callingApps) { if (service.shouldHide(caller, targetApp)) { diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt index 5ee7b9f..b93b70a 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt @@ -5,6 +5,7 @@ import android.os.Build import com.github.kyuubiran.ezxhelper.utils.findMethod import com.github.kyuubiran.ezxhelper.utils.hookBefore import de.robv.android.xposed.XC_MethodHook +import icu.nullptr.hidemyapplist.common.Constants import icu.nullptr.hidemyapplist.xposed.HMAService import icu.nullptr.hidemyapplist.xposed.Utils import icu.nullptr.hidemyapplist.xposed.logE @@ -26,7 +27,10 @@ class PmsHookTarget30(private val service: HMAService) : IFrameworkHook { }.hookBefore { param -> runCatching { val callingUid = param.args[0] as Int - val callingApps = service.pms.getPackagesForUid(callingUid) ?: return@hookBefore + if (callingUid == Constants.UID_SYSTEM) return@hookBefore + val callingApps = Utils.binderLocalScope { + service.pms.getPackagesForUid(callingUid) + } ?: return@hookBefore val targetApp = Utils.getPackageNameFromPackageSettings(param.args[2]) for (caller in callingApps) { if (service.shouldHide(caller, targetApp)) { diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt index 5df3515..0820053 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt @@ -5,6 +5,7 @@ import android.os.Build import com.github.kyuubiran.ezxhelper.utils.findMethod import com.github.kyuubiran.ezxhelper.utils.hookBefore import de.robv.android.xposed.XC_MethodHook +import icu.nullptr.hidemyapplist.common.Constants import icu.nullptr.hidemyapplist.xposed.HMAService import icu.nullptr.hidemyapplist.xposed.Utils import icu.nullptr.hidemyapplist.xposed.logE @@ -34,7 +35,10 @@ class PmsHookTarget33(private val service: HMAService) : IFrameworkHook { runCatching { val snapshot = param.args[0] val callingUid = param.args[1] as Int - val callingApps = getPackagesForUidMethod.invoke(snapshot, callingUid) as Array? ?: return@hookBefore + if (callingUid == Constants.UID_SYSTEM) return@hookBefore + val callingApps = Utils.binderLocalScope { + getPackagesForUidMethod.invoke(snapshot, callingUid) as Array? + } ?: return@hookBefore val targetApp = Utils.getPackageNameFromPackageSettings(param.args[3]) // PackageSettings <- PackageStateInternal for (caller in callingApps) { if (service.shouldHide(caller, targetApp)) {