diff --git a/zygiskd/src/root_impl/common.c b/zygiskd/src/root_impl/common.c index 4f0f0bc..62fe772 100644 --- a/zygiskd/src/root_impl/common.c +++ b/zygiskd/src/root_impl/common.c @@ -30,6 +30,7 @@ void root_impls_setup(void) { impl.impl = Multiple; } else if (state_ksu.state == Supported) { impl.impl = KernelSU; + impl.variant = state_ksu.variant; } else if (state_apatch.state == Supported) { impl.impl = APatch; } else if (state_magisk.state == Supported) { diff --git a/zygiskd/src/root_impl/kernelsu.c b/zygiskd/src/root_impl/kernelsu.c index f9f0968..0ded352 100644 --- a/zygiskd/src/root_impl/kernelsu.c +++ b/zygiskd/src/root_impl/kernelsu.c @@ -19,6 +19,9 @@ #define CMD_GET_VERSION 2 #define CMD_UID_GRANTED_ROOT 12 #define CMD_UID_SHOULD_UMOUNT 13 +#define CMD_HOOK_MODE 16 + +static enum kernelsu_variants variant = KOfficial; void ksu_get_existence(struct root_impl_state *state) { int version = 0; @@ -42,6 +45,15 @@ void ksu_get_existence(struct root_impl_state *state) { } state->state = Supported; + + char mode[16] = { 0 }; + prctl((signed int)KERNEL_SU_OPTION, CMD_HOOK_MODE, mode, 0, 0); + + if (mode[0] != '\0') state->variant = KNext; + else state->variant = KOfficial; + + state->variant = KNext; + variant = state->variant; } else if (version >= 1 && version <= MIN_KSU_VERSION - 1) state->state = TooOld; else state->state = Abnormal; @@ -68,8 +80,12 @@ bool ksu_uid_should_umount(uid_t uid) { } bool ksu_uid_is_manager(uid_t uid) { + const char *manager_path = NULL; + if (variant == KOfficial) manager_path = "/data/user_de/0/me.weishu.kernelsu"; + else if (variant == KNext) manager_path = "/data/user_de/0/com.rifsxd.ksunext"; + struct stat s; - if (stat("/data/user_de/0/me.weishu.kernelsu", &s) == -1) { + if (stat(manager_path, &s) == -1) { if (errno != ENOENT) { LOGE("Failed to stat KSU manager data directory: %s\n", strerror(errno)); } diff --git a/zygiskd/src/root_impl/kernelsu.h b/zygiskd/src/root_impl/kernelsu.h index 96a4c72..550c1aa 100644 --- a/zygiskd/src/root_impl/kernelsu.h +++ b/zygiskd/src/root_impl/kernelsu.h @@ -3,6 +3,11 @@ #include "../constants.h" +enum kernelsu_variants { + KOfficial, + KNext +}; + void ksu_get_existence(struct root_impl_state *state); bool ksu_uid_granted_root(uid_t uid); diff --git a/zygiskd/src/root_impl/magisk.c b/zygiskd/src/root_impl/magisk.c index 4b201f0..a2e8b3e 100644 --- a/zygiskd/src/root_impl/magisk.c +++ b/zygiskd/src/root_impl/magisk.c @@ -28,7 +28,7 @@ char *magisk_managers[] = { #define DEBUG_RAMDISK_MAGISK lp_select("/debug_ramdisk/magisk32", "/debug_ramdisk/magisk64") #define BITLESS_DEBUG_RAMDISK_MAGISK "/debug_ramdisk/magisk" -enum magisk_variants variant = Official; +static enum magisk_variants variant = MOfficial; /* INFO: Longest path */ static char path_to_magisk[sizeof(DEBUG_RAMDISK_MAGISK)] = { 0 }; bool is_using_sulist = false; @@ -74,7 +74,7 @@ void magisk_get_existence(struct root_impl_state *state) { return; } - state->variant = (uint8_t)Official; + state->variant = (uint8_t)MOfficial; for (unsigned long i = 0; i < sizeof(supported_variants) / sizeof(supported_variants[0]); i++) { if (strstr(magisk_info, supported_variants[i])) { diff --git a/zygiskd/src/root_impl/magisk.h b/zygiskd/src/root_impl/magisk.h index 4b8b164..6052127 100644 --- a/zygiskd/src/root_impl/magisk.h +++ b/zygiskd/src/root_impl/magisk.h @@ -4,8 +4,8 @@ #include "../constants.h" enum magisk_variants { - Official, - Kitsune + MOfficial, + MKitsune }; void magisk_get_existence(struct root_impl_state *state); diff --git a/zygiskd/src/utils.c b/zygiskd/src/utils.c index 3cc85b8..adc8398 100644 --- a/zygiskd/src/utils.c +++ b/zygiskd/src/utils.c @@ -20,6 +20,7 @@ #include "utils.h" #include "root_impl/common.h" +#include "root_impl/kernelsu.h" #include "root_impl/magisk.h" int clean_namespace_fd = 0; @@ -436,7 +437,8 @@ void stringify_root_impl_name(struct root_impl impl, char *restrict output) { break; } case KernelSU: { - strcpy(output, "KernelSU"); + if (impl.variant == KOfficial) strcpy(output, "KernelSU"); + else strcpy(output, "KernelSU Next"); break; } @@ -446,11 +448,8 @@ void stringify_root_impl_name(struct root_impl impl, char *restrict output) { break; } case Magisk: { - if (impl.variant == 0) { - strcpy(output, "Magisk Official"); - } else { - strcpy(output, "Magisk Kitsune"); - } + if (impl.variant == MOfficial) strcpy(output, "Magisk Official"); + else strcpy(output, "Magisk Kitsune"); break; } @@ -786,7 +785,7 @@ int save_mns_fd(int pid, enum MountNamespaceState mns_state, struct root_impl im return -1; } - if (impl.impl == Magisk && impl.variant == Kitsune && mns_state == Clean) { + if (impl.impl == Magisk && impl.variant == MKitsune && mns_state == Clean) { LOGI("[Magisk] Magisk Kitsune detected, will skip cache first."); /* INFO: MagiskSU of Kitsune has a special behavior: It is only mounted