From c285992226399133309544b371de10a0e1d9047a Mon Sep 17 00:00:00 2001 From: Dakkshesh Date: Sun, 31 Aug 2025 20:25:01 +0530 Subject: [PATCH] java: Implement keystore clearing for target packages during initialization - Currently using keystore2 API. - TODO: Add support for keystore1. Signed-off-by: Dakkshesh --- .../github/beakthoven/TrickyStoreOSS/Main.kt | 15 ++++++++++ .../TrickyStoreOSS/config/Config.kt | 28 +++++++++++++++++++ .../android/content/pm/IPackageManager.java | 4 +++ .../security/AndroidKeyStoreMaintenance.java | 13 +++++++++ 4 files changed, 60 insertions(+) create mode 100644 stub/src/main/java/android/security/AndroidKeyStoreMaintenance.java diff --git a/app/src/main/java/io/github/beakthoven/TrickyStoreOSS/Main.kt b/app/src/main/java/io/github/beakthoven/TrickyStoreOSS/Main.kt index 9150641..ba4c5c6 100644 --- a/app/src/main/java/io/github/beakthoven/TrickyStoreOSS/Main.kt +++ b/app/src/main/java/io/github/beakthoven/TrickyStoreOSS/Main.kt @@ -36,9 +36,24 @@ private fun initializeInterceptors() { } PkgConfig.initialize() + clearKeyStore() Logger.i("Interceptors initialized successfully") } +private fun clearKeyStore() { + val targetUIDs = PkgConfig.getTargetPackageUids() + Logger.i("Clearing keystore for ${targetUIDs.size} target packages") + + targetUIDs.forEach { uid -> + kotlin.runCatching { + android.security.AndroidKeyStoreMaintenance.clearNamespace(0, uid.toLong()) + Logger.d("Cleared keystore namespace for UID: $uid") + }.onFailure { + Logger.e("Failed to clear keystore for UID: $uid", it) + } + } +} + private fun selectKeystoreInterceptor() = when { Build.VERSION.SDK_INT in Build.VERSION_CODES.Q..Build.VERSION_CODES.R -> { Logger.i("Using KeystoreInterceptor for Android Q/R (SDK ${Build.VERSION.SDK_INT})") diff --git a/app/src/main/java/io/github/beakthoven/TrickyStoreOSS/config/Config.kt b/app/src/main/java/io/github/beakthoven/TrickyStoreOSS/config/Config.kt index c802b5e..b41b3e2 100644 --- a/app/src/main/java/io/github/beakthoven/TrickyStoreOSS/config/Config.kt +++ b/app/src/main/java/io/github/beakthoven/TrickyStoreOSS/config/Config.kt @@ -9,6 +9,7 @@ import android.content.pm.IPackageManager import android.os.FileObserver import android.os.IBinder import android.os.IInterface +import android.os.Process import android.os.ServiceManager import io.github.beakthoven.TrickyStoreOSS.AttestUtils.TEEStatus import io.github.beakthoven.TrickyStoreOSS.KeyBoxUtils @@ -174,6 +175,33 @@ object PkgConfig { return false }.onFailure { Logger.e("failed to get packages", it) }.getOrNull() ?: false + private fun getTargetPackages(): Set { + return (hackPackages + generatePackages + packageModes.keys).toSet() + } + + fun getTargetPackageUids(): Set { + val result = mutableSetOf() + val pm = getPm() ?: return emptySet() + val flags = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) 0L else 0 + val userId = Process.myUid() / 100000 + + getTargetPackages().forEach { pkg -> + kotlin.runCatching { + val appInfo = pm.getApplicationInfo(pkg, flags, userId) + if (appInfo != null) { + result.add(appInfo.uid) + Logger.d("Got UID ${appInfo.uid} for package: $pkg") + } else { + Logger.e("ApplicationInfo is null for package: $pkg") + } + }.onFailure { + Logger.e("Failed to get UID for package: $pkg", it) + } + } + + return result + } + @Volatile var _customPatchLevel: CustomPatchLevel? = null diff --git a/stub/src/main/java/android/content/pm/IPackageManager.java b/stub/src/main/java/android/content/pm/IPackageManager.java index d5eeaf1..0b32343 100644 --- a/stub/src/main/java/android/content/pm/IPackageManager.java +++ b/stub/src/main/java/android/content/pm/IPackageManager.java @@ -10,6 +10,10 @@ import android.os.IBinder; public interface IPackageManager { String[] getPackagesForUid(int uid); + ApplicationInfo getApplicationInfo(String packageName, int flags, int userId); + + ApplicationInfo getApplicationInfo(String packageName, long flags, int userId); + PackageInfo getPackageInfo(String packageName, long flags, int userId); PackageInfo getPackageInfo(String packageName, int flags, int userId); diff --git a/stub/src/main/java/android/security/AndroidKeyStoreMaintenance.java b/stub/src/main/java/android/security/AndroidKeyStoreMaintenance.java new file mode 100644 index 0000000..a478f9c --- /dev/null +++ b/stub/src/main/java/android/security/AndroidKeyStoreMaintenance.java @@ -0,0 +1,13 @@ +/* + * Copyright 2025 Dakkshesh + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package android.security; + +public class AndroidKeyStoreMaintenance { + + public static int clearNamespace(int domain, long namespace) { + throw new RuntimeException(""); + } +} \ No newline at end of file