kernel: Enhance the user space scanning functionality
This commit is contained in:
@@ -431,4 +431,16 @@ NativeBridge(verifyModuleSignature, jboolean, jstring modulePath) {
|
||||
LogDebug("verifyModuleSignature: not supported on non-ARM architecture");
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
NativeBridgeNP(isUidScannerEnabled, jboolean) {
|
||||
return is_uid_scanner_enabled();
|
||||
}
|
||||
|
||||
NativeBridge(setUidScannerEnabled, jboolean, jboolean enabled) {
|
||||
return set_uid_scanner_enabled(enabled);
|
||||
}
|
||||
|
||||
NativeBridgeNP(clearUidScannerEnvironment, jboolean) {
|
||||
return clear_uid_scanner_environment();
|
||||
}
|
||||
@@ -48,6 +48,7 @@ extern const char* zako_file_verrcidx2str(uint8_t index);
|
||||
#define CMD_GET_SUSFS_FEATURE_STATUS 102
|
||||
#define CMD_DYNAMIC_MANAGER 103
|
||||
#define CMD_GET_MANAGERS 104
|
||||
#define CMD_ENABLE_UID_SCANNER 105
|
||||
|
||||
#define DYNAMIC_MANAGER_OP_SET 0
|
||||
#define DYNAMIC_MANAGER_OP_GET 1
|
||||
@@ -249,4 +250,18 @@ bool verify_module_signature(const char* input) {
|
||||
LogDebug("verify_module_signature: not supported on non-ARM architecture, path=%s", input ? input : "null");
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool is_uid_scanner_enabled() {
|
||||
bool status = false;
|
||||
ksuctl(CMD_ENABLE_UID_SCANNER, (void*)0, &status);
|
||||
return status;
|
||||
}
|
||||
|
||||
bool set_uid_scanner_enabled(bool enabled) {
|
||||
return ksuctl(CMD_ENABLE_UID_SCANNER, (void*)1, (void*)enabled);
|
||||
}
|
||||
|
||||
bool clear_uid_scanner_environment() {
|
||||
return ksuctl(CMD_ENABLE_UID_SCANNER, (void*)2, NULL);
|
||||
}
|
||||
@@ -137,4 +137,10 @@ bool get_managers_list(struct manager_list_info* info);
|
||||
|
||||
bool verify_module_signature(const char* input);
|
||||
|
||||
bool is_uid_scanner_enabled();
|
||||
|
||||
bool set_uid_scanner_enabled(bool enabled);
|
||||
|
||||
bool clear_uid_scanner_environment();
|
||||
|
||||
#endif //KERNELSU_KSU_H
|
||||
@@ -138,6 +138,26 @@ object Natives {
|
||||
// 模块签名验证
|
||||
external fun verifyModuleSignature(modulePath: String): Boolean
|
||||
|
||||
/**
|
||||
* Check if UID scanner is currently enabled
|
||||
* @return true if UID scanner is enabled, false otherwise
|
||||
*/
|
||||
external fun isUidScannerEnabled(): Boolean
|
||||
|
||||
/**
|
||||
* Enable or disable UID scanner
|
||||
* @param enabled true to enable, false to disable
|
||||
* @return true if operation was successful, false otherwise
|
||||
*/
|
||||
external fun setUidScannerEnabled(enabled: Boolean): Boolean
|
||||
|
||||
/**
|
||||
* Clear UID scanner environment (force exit)
|
||||
* This will forcefully stop all UID scanner operations and clear the environment
|
||||
* @return true if operation was successful, false otherwise
|
||||
*/
|
||||
external fun clearUidScannerEnvironment(): Boolean
|
||||
|
||||
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
|
||||
private const val NOBODY_UID = 9999
|
||||
|
||||
|
||||
@@ -46,11 +46,7 @@ import com.sukisu.ultra.ui.theme.CardConfig
|
||||
import com.sukisu.ultra.ui.theme.CardConfig.cardAlpha
|
||||
import com.sukisu.ultra.ui.theme.getCardColors
|
||||
import com.sukisu.ultra.ui.theme.getCardElevation
|
||||
import com.sukisu.ultra.ui.util.LocalSnackbarHost
|
||||
import com.sukisu.ultra.ui.util.getBugreportFile
|
||||
import com.sukisu.ultra.ui.util.getRootShell
|
||||
import com.sukisu.ultra.ui.util.setUidAutoScan
|
||||
import com.sukisu.ultra.ui.util.setUidMultiUserScan
|
||||
import com.sukisu.ultra.ui.util.*
|
||||
import com.topjohnwu.superuser.ShellUtils
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -181,6 +177,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
forceSignatureVerification = enabled
|
||||
}
|
||||
)
|
||||
// UID 扫描开关
|
||||
if (Natives.version >= Natives.MINIMAL_SUPPORTED_UID_SCANNER) {
|
||||
var uidAutoScanEnabled by rememberSaveable {
|
||||
mutableStateOf(prefs.getBoolean("uid_auto_scan", false))
|
||||
@@ -189,6 +186,17 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
var uidMultiUserScanEnabled by rememberSaveable {
|
||||
mutableStateOf(prefs.getBoolean("uid_multi_user_scan", false))
|
||||
}
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
uidAutoScanEnabled = Natives.isUidScannerEnabled()
|
||||
uidMultiUserScanEnabled = getUidMultiUserScan()
|
||||
|
||||
prefs.edit {
|
||||
putBoolean("uid_auto_scan", uidAutoScanEnabled)
|
||||
putBoolean("uid_multi_user_scan", uidMultiUserScanEnabled)
|
||||
}
|
||||
}
|
||||
|
||||
// 用户态扫描应用列表开关
|
||||
SwitchItem(
|
||||
icon = Icons.Filled.Scanner,
|
||||
@@ -281,6 +289,8 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
uidMultiUserScanEnabled = false
|
||||
prefs.edit { putBoolean("uid_multi_user_scan", false) }
|
||||
|
||||
Natives.setUidScannerEnabled(false)
|
||||
|
||||
snackBarHost.showSnackbar(context.getString(R.string.clean_runtime_environment_success))
|
||||
} else {
|
||||
snackBarHost.showSnackbar(context.getString(R.string.clean_runtime_environment_failed))
|
||||
@@ -470,6 +480,7 @@ fun cleanRuntimeEnvironment(): Boolean {
|
||||
ShellUtils.fastCmdResult(shell, "rm -rf /data/adb/uid_scanner")
|
||||
ShellUtils.fastCmdResult(shell, "rm -rf /data/adb/ksu/bin/user_uid")
|
||||
ShellUtils.fastCmdResult(shell, "rm -rf /data/adb/service.d/uid_scanner.sh")
|
||||
Natives.clearUidScannerEnvironment()
|
||||
true
|
||||
} catch (_: Exception) {
|
||||
false
|
||||
|
||||
@@ -609,7 +609,10 @@ fun setUidAutoScan(enabled: Boolean): Boolean {
|
||||
val enableValue = if (enabled) 1 else 0
|
||||
val cmd = "$targetPath --auto-scan $enableValue && $targetPath reload"
|
||||
val result = ShellUtils.fastCmdResult(shell, cmd)
|
||||
return result
|
||||
|
||||
val throneResult = Natives.setUidScannerEnabled(enabled)
|
||||
|
||||
return result && throneResult
|
||||
}
|
||||
|
||||
fun setUidMultiUserScan(enabled: Boolean): Boolean {
|
||||
@@ -623,3 +626,16 @@ fun setUidMultiUserScan(enabled: Boolean): Boolean {
|
||||
val result = ShellUtils.fastCmdResult(shell, cmd)
|
||||
return result
|
||||
}
|
||||
|
||||
fun getUidMultiUserScan(): Boolean {
|
||||
val shell = getRootShell()
|
||||
|
||||
val cmd = "grep 'multi_user_scan=' /data/misc/user_uid/uid_scanner.conf | cut -d'=' -f2"
|
||||
val result = ShellUtils.fastCmd(shell, cmd).trim()
|
||||
|
||||
return try {
|
||||
result.toInt() == 1
|
||||
} catch (_: NumberFormatException) {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user