diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/MainActivity.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/MainActivity.kt index 8fba1618..77c6f47b 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/MainActivity.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/MainActivity.kt @@ -65,11 +65,11 @@ class MainActivity : ComponentActivity() { val prefs = getSharedPreferences("settings", MODE_PRIVATE) - val suSFSVar = getSuSFSVariant() - if (suSFSVar != "NON-GKI") { - if (prefs.getBoolean("enable_susfs", false)) { - if (susfsSUSSU_Mode() != "2") { - susfsSUSSU_1() + val isSUS_SU = getSuSFSFeatures() + if (isSUS_SU == "CONFIG_KSU_SUSFS_SUS_SU") { + if (prefs.getBoolean("enable_sus_su", false)) { + if (susfsSUS_SU_Mode() != "2") { + susfsSUS_SU_2() } } } @@ -139,7 +139,7 @@ private fun BottomBar(navController: NavHostController) { } }, label = { Text(stringResource(destination.label)) }, - alwaysShowLabel = false + alwaysShowLabel = true ) } } 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 237afefe..ad2d3a17 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 @@ -21,6 +21,7 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler @@ -346,15 +347,21 @@ private fun InfoCard() { val uname = Os.uname() @Composable - fun InfoCardItem(label: String, content: String, icon: ImageVector? = null) { + fun InfoCardItem(label: String, content: String, icon: Any? = null) { Row(verticalAlignment = Alignment.CenterVertically) { if (icon != null) { - Icon( - imageVector = icon, - contentDescription = null, - modifier = Modifier - .padding(end = 20.dp) - ) + when (icon) { + is ImageVector -> Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier.padding(end = 20.dp) + ) + is Painter -> Icon( + painter = icon, + contentDescription = null, + modifier = Modifier.padding(end = 20.dp) + ) + } } Column { Text( @@ -375,7 +382,7 @@ private fun InfoCard() { InfoCardItem( label = stringResource(R.string.home_kernel), content = uname.release, - icon = Icons.Filled.Memory, + icon = painterResource(R.drawable.ic_linux), ) Spacer(Modifier.height(16.dp)) @@ -391,7 +398,7 @@ private fun InfoCard() { InfoCardItem( label = stringResource(R.string.home_manager_version), content = "${managerVersion.first}-next (${managerVersion.second})", - icon = Icons.AutoMirrored.Filled.Article, + icon = painterResource(R.drawable.ic_ksu_next), ) Spacer(Modifier.height(16.dp)) @@ -402,12 +409,15 @@ private fun InfoCard() { ) Spacer(Modifier.height(16.dp)) + val isSUS_SU = getSuSFSFeatures() == "CONFIG_KSU_SUSFS_SUS_SU" val suSFS = getSuSFS() - if (suSFS != "Unsupported") { + + if (suSFS == "Supported") { + val susSUMode = if (isSUS_SU) "sus su mode: ${susfsSUS_SU_Mode()}" else "" InfoCardItem( label = stringResource(R.string.home_susfs_version), - content = "${getSuSFSVersion()} (${getSuSFSVariant()}) [+] sus_su mode: ${susfsSUSSU_Mode()}", - icon = Icons.Filled.SettingsSuggest, + content = "${getSuSFSVersion()} (${getSuSFSVariant()}) | $susSUMode", + icon = painterResource(R.drawable.ic_sus), ) } } diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt index 2fcd9f80..992c2da7 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt @@ -34,6 +34,7 @@ import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -187,11 +188,16 @@ fun SettingScreen(navigator: DestinationsNavigator) { enableWebDebugging = it } - val suSFSVar = getSuSFSVariant() - if (suSFSVar != "NON-GKI") { + val isSUS_SU = getSuSFSFeatures() + if (isSUS_SU == "CONFIG_KSU_SUSFS_SUS_SU") { var isEnabled by rememberSaveable { - mutableStateOf(prefs.getBoolean("enable_susfs", susfsSUSSU_Mode() == "2")) + mutableStateOf(susfsSUS_SU_Mode() == "2") } + + LaunchedEffect(Unit) { + isEnabled = susfsSUS_SU_Mode() == "2" + } + SwitchItem( icon = Icons.Filled.VisibilityOff, title = stringResource(id = R.string.settings_susfs_toggle), @@ -199,11 +205,11 @@ fun SettingScreen(navigator: DestinationsNavigator) { checked = isEnabled ) { if (it) { - susfsSUSSU_1() + susfsSUS_SU_2() } else { - susfsSUSSU_0() + susfsSUS_SU_0() } - prefs.edit().putBoolean("enable_susfs", it).apply() + prefs.edit().putBoolean("enable_sus_su", it).apply() isEnabled = it } } diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt index 2bf760c5..24ea7118 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt @@ -141,22 +141,27 @@ fun getSuSFSVariant(): String { val result = ShellUtils.fastCmd(shell, "${getSuSFSPath()} variant") return result } +fun getSuSFSFeatures(): String { + val shell = getRootShell() + val result = ShellUtils.fastCmd(shell, "${getSuSFSPath()} features") + return result +} -fun susfsSUSSU_0(): String { +fun susfsSUS_SU_0(): String { val shell = getRootShell() val result = ShellUtils.fastCmd(shell, "${getSuSFSPath()} sus_su 0") return result } -fun susfsSUSSU_1(): String { +fun susfsSUS_SU_2(): String { val shell = getRootShell() val result = ShellUtils.fastCmd(shell, "${getSuSFSPath()} sus_su 2") return result } -fun susfsSUSSU_Mode(): String { +fun susfsSUS_SU_Mode(): String { val shell = getRootShell() - val result = ShellUtils.fastCmd(shell, "${getSuSFSPath()} sus_su show_working_mode") + val result = ShellUtils.fastCmd(shell, "${getSuSFSPath()} sus_su mode") return result } @@ -444,7 +449,7 @@ fun getAppProfileTemplate(id: String): String { fun setAppProfileTemplate(id: String, template: String): Boolean { val shell = getRootShell() val escapedTemplate = template.replace("\"", "\\\"") - val cmd = """${getKsuDaemonPath()} profile set-template "$id" "$escapedTemplate""""" + val cmd = """${getKsuDaemonPath()} profile set-template "$id" "$escapedTemplate'"""" return shell.newJob().add(cmd) .to(ArrayList(), null).exec().isSuccess } diff --git a/manager/app/src/main/jniLibs/arm64-v8a/libsusfs.so b/manager/app/src/main/jniLibs/arm64-v8a/libsusfs.so index 77167075..cc59ba9d 100755 Binary files a/manager/app/src/main/jniLibs/arm64-v8a/libsusfs.so and b/manager/app/src/main/jniLibs/arm64-v8a/libsusfs.so differ diff --git a/manager/app/src/main/res/drawable/ic_ksu_next.xml b/manager/app/src/main/res/drawable/ic_ksu_next.xml new file mode 100644 index 00000000..c2349724 --- /dev/null +++ b/manager/app/src/main/res/drawable/ic_ksu_next.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/manager/app/src/main/res/drawable/ic_linux.xml b/manager/app/src/main/res/drawable/ic_linux.xml new file mode 100644 index 00000000..e1bd9638 --- /dev/null +++ b/manager/app/src/main/res/drawable/ic_linux.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/manager/app/src/main/res/drawable/ic_sus.xml b/manager/app/src/main/res/drawable/ic_sus.xml new file mode 100644 index 00000000..5010e357 --- /dev/null +++ b/manager/app/src/main/res/drawable/ic_sus.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 72b9a863..1de03d64 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ Having Trouble? Encountered a bug or have feedback? - Let us know as soon as possible! + Report it as soon as possible! Report on GitHub Contact via Telegram https://github.com/rifsxd/KernelSU-Next/issues @@ -21,6 +21,7 @@ Kernel SuSFS: %s SuSFS + SuS SU Android Manager SELinux @@ -89,7 +90,7 @@ The current KernelSU-Next version %d is too low for the manager to work properly. Please upgrade to version %d or higher! Umount modules by default The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. - Hide suspecious su with SuSFS + Hide suspecious su hooks It disables kprobe hooks made by ksu, and instead the non-kprobe inline hooks will be enabled, just the same implementation for non-gki kernel without kprobe supported. Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. Domain diff --git a/userspace/susfs/jni/susfs.c b/userspace/susfs/jni/susfs.c index 13276611..44dbc765 100644 --- a/userspace/susfs/jni/susfs.c +++ b/userspace/susfs/jni/susfs.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include #define KERNEL_SU_OPTION 0xDEADBEEF @@ -54,25 +56,16 @@ int main(int argc, char *argv[]) { char support[16]; char version[16]; char variant[16]; + + // Check for arguments if (argc < 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); + fprintf(stderr, "Usage: %s |>\n", argv[0]); return 1; } - - // If 'version' is given, show version - if (strcmp(argv[1], "support") == 0) { - prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_VERSION, support, NULL, &error); - if (!error) { - if (support[0] == 'v') { - printf("Supported\n"); - } - } else { - printf("Unsupported\n"); - } - } else if (strcmp(argv[1], "version") == 0) { + if (strcmp(argv[1], "version") == 0) { prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_VERSION, version, NULL, &error); if (!error) { printf("%s\n", version); @@ -86,6 +79,111 @@ int main(int argc, char *argv[]) { } else { printf("Invalid\n"); } + } else if (strcmp(argv[1], "features") == 0) { + char *enabled_features_buf = malloc(getpagesize() * 2); + char *ptr_buf; + unsigned long enabled_features; + int str_len; + + if (!enabled_features_buf) { + perror("malloc"); + return -ENOMEM; + } + ptr_buf = enabled_features_buf; + + prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_ENABLED_FEATURES, &enabled_features, NULL, &error); + if (!error) { + if (enabled_features & (1 << 0)) { + str_len = strlen("CONFIG_KSU_SUSFS_SUS_PATH\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_SUS_PATH\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 1)) { + str_len = strlen("CONFIG_KSU_SUSFS_SUS_MOUNT\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_SUS_MOUNT\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 2)) { + str_len = strlen("CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 3)) { + str_len = strlen("CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 4)) { + str_len = strlen("CONFIG_KSU_SUSFS_SUS_KSTAT\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_SUS_KSTAT\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 5)) { + str_len = strlen("CONFIG_KSU_SUSFS_SUS_OVERLAYFS\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_SUS_OVERLAYFS\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 6)) { + str_len = strlen("CONFIG_KSU_SUSFS_TRY_UMOUNT\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_TRY_UMOUNT\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 7)) { + str_len = strlen("CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 8)) { + str_len = strlen("CONFIG_KSU_SUSFS_SPOOF_UNAME\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_SPOOF_UNAME\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 9)) { + str_len = strlen("CONFIG_KSU_SUSFS_ENABLE_LOG\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_ENABLE_LOG\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 10)) { + str_len = strlen("CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 11)) { + str_len = strlen("CONFIG_KSU_SUSFS_SPOOF_BOOTCONFIG\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_SPOOF_BOOTCONFIG\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 12)) { + str_len = strlen("CONFIG_KSU_SUSFS_OPEN_REDIRECT\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_OPEN_REDIRECT\n", str_len); + ptr_buf += str_len; + } + if (enabled_features & (1 << 13)) { + str_len = strlen("CONFIG_KSU_SUSFS_SUS_SU\n"); + strncpy(ptr_buf, "CONFIG_KSU_SUSFS_SUS_SU\n", str_len); + ptr_buf += str_len; + } + printf("%s", enabled_features_buf); + free(enabled_features_buf); + } + } else if (strcmp(argv[1], "support") == 0) { + unsigned long enabled_features; + int any_feature_enabled = 0; + + prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_ENABLED_FEATURES, &enabled_features, NULL, &error); + if (!error) { + if (enabled_features & ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | + (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | + (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | + (1 << 12) | (1 << 13))) { + any_feature_enabled = 1; + } + if (any_feature_enabled) { + printf("Supported\n"); + } else { + printf("Unsupported\n"); + } + } } else if (argc == 3 && !strcmp(argv[1], "sus_su")) { int last_working_mode = 0; int target_working_mode; @@ -94,7 +192,7 @@ int main(int argc, char *argv[]) { prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_SUS_SU_WORKING_MODE, &last_working_mode, NULL, &error); if (error) return error; - if (!strcmp(argv[2], "show_working_mode")) { + if (!strcmp(argv[2], "mode")) { printf("%d\n", last_working_mode); return 0; }