From 84cb1ac04dace24795ec7406b406f8b9fd71dbd0 Mon Sep 17 00:00:00 2001 From: Rifat Azad Date: Mon, 23 Dec 2024 23:56:58 +0600 Subject: [PATCH] manager: susfs feature overhaul and some minor bug fixes susfs: more prctl syscalls added --- .../com/rifsxd/ksunext/ui/MainActivity.kt | 12 +- .../java/com/rifsxd/ksunext/ui/screen/Home.kt | 34 +++-- .../com/rifsxd/ksunext/ui/screen/Settings.kt | 18 ++- .../java/com/rifsxd/ksunext/ui/util/KsuCli.kt | 15 ++- .../src/main/jniLibs/arm64-v8a/libsusfs.so | Bin 6248 -> 7936 bytes .../app/src/main/res/drawable/ic_ksu_next.xml | 17 +++ .../app/src/main/res/drawable/ic_linux.xml | 11 ++ manager/app/src/main/res/drawable/ic_sus.xml | 9 ++ manager/app/src/main/res/values/strings.xml | 5 +- userspace/susfs/jni/susfs.c | 126 ++++++++++++++++-- 10 files changed, 202 insertions(+), 45 deletions(-) create mode 100644 manager/app/src/main/res/drawable/ic_ksu_next.xml create mode 100644 manager/app/src/main/res/drawable/ic_linux.xml create mode 100644 manager/app/src/main/res/drawable/ic_sus.xml 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 77167075d39189515a7d5297b63b224325ef5c3f..cc59ba9dd0440de0ac909dcf2a75f16189697c74 100755 GIT binary patch literal 7936 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 J_|Eza{|AwW(Rcs= delta 2456 zcmbtWZERCj7=CZNjrMlk`n3=G-3eq&-6nKZ5a(q;Ht-AQriR3<9UW|eZP1n>f!GcF zLGaIR&Xj;?hChVuhgkxeOqZ}2ei(m{#t7;XOgBbS5w#dbRuic2x%ZrTv&8trlk~p# zdEU?S-qUl=U}L6!xYCv}fHEXiK($S-`E+y2tU@lqqGAC>5&k%z@-RClhjl6*CRU-s z7G_@IdX){=la0a}86c`)8bb|5_G8GJ)%^ls!(|Lc@#^(hSw{M`l#0MYz~T|Uc=M2 z@bQdaeWQ7cAjxR}NuyxjNKv+Ec((c!ey4_KlU4XPHM~h-)JJ z@9FP57C%&U;6Q&Y(MVn}G>O~$1|s`=qOdwjE*M)@3`Al*k-h|ZPu#jT-raw=<8Xg$ zUr*oOj^6%g7cgUgB)0cZZ&zP}2F5Cg$#mOwmG*6GNqA?mr=I9W3f?dJ!0@s7QL(7M zPfW#|>L&0*OrY@u+D+Vg4CGn8Z`|-pb8hW#&AA=-nsb>8Fm|UDa!vP}a}R+G6hB_} zv|w2PaCEHFU-$X-*S9E`d{NwLp9dI8mr9d^I%vSW!(i|bmpM@W1LM=c_yVtd14yg6 zR(B1^ar3%lZz;4Tilp3v9%^t23bAAvkraHGT7R>tz^?&20gBs06I@uYo*z{i|f`7S20whso1u zoUV{2r;X4M7p0sM=%N<`*~iaOoe06%-JswmVX*Z>f-;LXx4az#-p%JLsIl@H zvR-)(*93I{LCS4Iy&nc!=h23Cj~0u|x27(iKm9Xuyn~brq3r_af-ZS8`aOkQ7CF=> zYpT#GT>+EuSH6KN|3C${aU^^6${22{DJw2cOBKj|o$m&%oc|OZt`kd>s#9fOxW>?l(c``05 zNx)er4zdz3^)6>fT3Cy)V@_Ad#yiGk7D%V7cI5=UYvACr zinm)nZzoeOhxpIgPi9;p(SnPd4vT>}-Jzws4Zq`57m!YOt#x@%rpZ0Gom_UiMSfPN z%w)zL5|@r>GjV!CB0rh4X0i+6()Fc;oJGjb{ZuKL@r104?3i9GRZHq70dJkSbQ7|W XUEW4r*h0>F8;ws`RhtJSu+sN8M2j28 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; }