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;
}