From 4e3f06d405d3c0b63935459392d9c760f71d4cbd Mon Sep 17 00:00:00 2001 From: Rifat Azad Date: Mon, 30 Jun 2025 14:19:07 +0600 Subject: [PATCH] kernel: added new prctl CMD_GET_MANAGER_UID to get the uid of the crowned manager manager: show crowned manager uid in infocard when developer options is enabled --- kernel/core_hook.c | 11 +++++++++++ kernel/ksu.h | 1 + manager/app/src/main/cpp/jni.cc | 7 +++++++ manager/app/src/main/cpp/ksu.cc | 8 ++++++++ manager/app/src/main/cpp/ksu.h | 2 ++ .../app/src/main/java/com/rifsxd/ksunext/Natives.kt | 9 +++++++++ .../main/java/com/rifsxd/ksunext/ui/screen/Home.kt | 11 ++++++++++- 7 files changed, 48 insertions(+), 1 deletion(-) diff --git a/kernel/core_hook.c b/kernel/core_hook.c index 2307e665..b90a506a 100644 --- a/kernel/core_hook.c +++ b/kernel/core_hook.c @@ -328,6 +328,17 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, return 0; } + if (arg2 == CMD_GET_MANAGER_UID) { + uid_t manager_uid = ksu_get_manager_uid(); + if (copy_to_user((void __user *)arg3, &manager_uid, sizeof(manager_uid))) { + pr_err("prctl reply error, cmd: %lu\n", arg2); + } + if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) { + pr_err("prctl reply error, cmd: %lu\n", arg2); + } + return 0; + } + if (arg2 == CMD_HOOK_MODE) { #ifdef CONFIG_KSU_KPROBES_HOOK const char *mode = "Kprobes"; diff --git a/kernel/ksu.h b/kernel/ksu.h index af81a43d..017530be 100644 --- a/kernel/ksu.h +++ b/kernel/ksu.h @@ -24,6 +24,7 @@ #define CMD_IS_SU_ENABLED 14 #define CMD_ENABLE_SU 15 #define CMD_HOOK_MODE 16 +#define CMD_GET_MANAGER_UID 17 #define EVENT_POST_FS_DATA 1 #define EVENT_BOOT_COMPLETED 2 diff --git a/manager/app/src/main/cpp/jni.cc b/manager/app/src/main/cpp/jni.cc index 85867951..acaea577 100644 --- a/manager/app/src/main/cpp/jni.cc +++ b/manager/app/src/main/cpp/jni.cc @@ -25,6 +25,13 @@ Java_com_rifsxd_ksunext_Natives_getVersion(JNIEnv *env, jobject) { return get_version(); } +extern "C" +JNIEXPORT jint JNICALL +Java_com_rifsxd_ksunext_Natives_getManagerUid(JNIEnv *env, jobject) { + uid_t manager_uid = get_manager_uid(); + return (jint)manager_uid; +} + extern "C" JNIEXPORT jstring JNICALL Java_com_rifsxd_ksunext_Natives_getHookMode(JNIEnv *env, jobject) { diff --git a/manager/app/src/main/cpp/ksu.cc b/manager/app/src/main/cpp/ksu.cc index f2e72ee9..da048b42 100644 --- a/manager/app/src/main/cpp/ksu.cc +++ b/manager/app/src/main/cpp/ksu.cc @@ -30,6 +30,7 @@ #define CMD_IS_SU_ENABLED 14 #define CMD_ENABLE_SU 15 #define CMD_HOOK_MODE 16 +#define CMD_GET_MANAGER_UID 17 static bool ksuctl(int cmd, void* arg1, void* arg2) { int32_t result = 0; @@ -63,12 +64,19 @@ int get_version(void) { return version; } +uid_t get_manager_uid() { + uid_t manager_uid = (uid_t)-1; + ksuctl(CMD_GET_MANAGER_UID, &manager_uid, nullptr); + return manager_uid; +} + const char* get_hook_mode() { static char mode[16]; ksuctl(CMD_HOOK_MODE, mode, nullptr); return mode; } + bool get_allow_list(int *uids, int *size) { return ksuctl(CMD_GET_SU_LIST, uids, size); } diff --git a/manager/app/src/main/cpp/ksu.h b/manager/app/src/main/cpp/ksu.h index 17394da5..17b4aebd 100644 --- a/manager/app/src/main/cpp/ksu.h +++ b/manager/app/src/main/cpp/ksu.h @@ -11,6 +11,8 @@ bool become_manager(const char *); int get_version(); +uid_t get_manager_uid(); + const char* get_hook_mode(); bool get_allow_list(int *uids, int *size); diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt b/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt index 03296028..e8b00d13 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt @@ -28,6 +28,9 @@ object Natives { // 12569: support get hook mode const val MINIMAL_SUPPORTED_HOOK_MODE = 12569 + // 12750: support get manager UID + const val MINIMAL_SUPPORTED_MANAGER_UID = 12751 + const val KERNEL_SU_DOMAIN = "u:r:su:s0" const val ROOT_UID = 0 @@ -54,6 +57,12 @@ object Natives { external fun uidShouldUmount(uid: Int): Boolean + /** + * Get the UID of the current root manager. + * @return manager UID, or -1 if unavailable. + */ + external fun getManagerUid(): Int + /** * Get a string indicating the SU hook mode enabled in kernel. * The return values are: diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt index c8ae9f9b..c973d000 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt @@ -550,6 +550,8 @@ private fun InfoCard(autoExpand: Boolean = false) { var expanded by rememberSaveable { mutableStateOf(false) } + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + LaunchedEffect(autoExpand) { if (autoExpand) { expanded = true @@ -598,7 +600,14 @@ private fun InfoCard(autoExpand: Boolean = false) { val managerVersion = getManagerVersion(context) InfoCardItem( label = stringResource(R.string.home_manager_version), - content = "${managerVersion.first} (${managerVersion.second})", + content = if ( + developerOptionsEnabled && + Natives.version >= Natives.MINIMAL_SUPPORTED_MANAGER_UID + ) { + "${managerVersion.first} (${managerVersion.second}) | UID: ${Natives.getManagerUid()}" + } else { + "${managerVersion.first} (${managerVersion.second})" + }, icon = painterResource(R.drawable.ic_ksu_next), )