From da164ebeede4b474f410e6c978d500ad576645a6 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Sun, 24 Aug 2025 11:00:17 +0800 Subject: [PATCH] kernel: Modified dynamic signature All files have been renamed to the correct names: Dynamic Manager --- kernel/Makefile | 2 +- kernel/apk_sign.c | 12 +- kernel/core_hook.c | 20 +- kernel/{dynamic_sign.c => dynamic_manager.c} | 180 +++++++++--------- kernel/dynamic_manager.h | 43 +++++ kernel/dynamic_sign.h | 43 ----- kernel/ksu.h | 10 +- kernel/throne_tracker.c | 10 +- manager/app/src/main/cpp/jni.c | 30 +-- manager/app/src/main/cpp/ksu.c | 30 +-- manager/app/src/main/cpp/ksu.h | 14 +- .../src/main/java/com/sukisu/ultra/Natives.kt | 20 +- .../java/com/sukisu/ultra/ui/screen/Home.kt | 2 +- .../ultra/ui/viewmodel/HomeViewModel.kt | 8 +- .../zako/zako/zakoui/screen/MoreSettings.kt | 38 ++-- .../app/src/main/res/values-in/strings.xml | 18 +- .../app/src/main/res/values-ja/strings.xml | 18 +- .../app/src/main/res/values-ru/strings.xml | 18 +- .../app/src/main/res/values-tr/strings.xml | 18 +- .../app/src/main/res/values-vi/strings.xml | 18 +- .../src/main/res/values-zh-rCN/strings.xml | 22 +-- .../src/main/res/values-zh-rHK/strings.xml | 18 +- .../src/main/res/values-zh-rTW/strings.xml | 18 +- manager/app/src/main/res/values/strings.xml | 24 +-- 24 files changed, 317 insertions(+), 317 deletions(-) rename kernel/{dynamic_sign.c => dynamic_manager.c} (65%) create mode 100644 kernel/dynamic_manager.h delete mode 100644 kernel/dynamic_sign.h diff --git a/kernel/Makefile b/kernel/Makefile index fb119acd..a9650d0c 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,6 +1,6 @@ kernelsu-objs := ksu.o kernelsu-objs += allowlist.o -kernelsu-objs += dynamic_sign.o +kernelsu-objs += dynamic_manager.o kernelsu-objs += apk_sign.o kernelsu-objs += sucompat.o kernelsu-objs += throne_tracker.o diff --git a/kernel/apk_sign.c b/kernel/apk_sign.c index 53da9f7a..2a51c19f 100644 --- a/kernel/apk_sign.c +++ b/kernel/apk_sign.c @@ -15,7 +15,7 @@ #endif #include "apk_sign.h" -#include "dynamic_sign.h" +#include "dynamic_manager.h" #include "klog.h" // IWYU pragma: keep #include "kernel_compat.h" #include "manager_sign.h" @@ -109,7 +109,7 @@ static bool check_block(struct file *fp, u32 *size4, loff_t *pos, u32 *offset, i if (i == 1) { // Dynamic Sign indexing unsigned int size; const char *hash; - if (ksu_get_dynamic_sign_config(&size, &hash)) { + if (ksu_get_dynamic_manager_config(&size, &hash)) { sign_key.size = size; sign_key.sha256 = hash; } @@ -219,8 +219,8 @@ static __always_inline bool check_v2_signature(char *path, bool check_multi_mana return false; } - // If you want to check for multi-manager APK signing, but dynamic signing is not enabled, skip - if (check_multi_manager && !ksu_is_dynamic_sign_enabled()) { + // If you want to check for multi-manager APK signing, but dynamic managering is not enabled, skip + if (check_multi_manager && !ksu_is_dynamic_manager_enabled()) { filp_close(fp, 0); return 0; } @@ -328,7 +328,7 @@ clean: if (check_multi_manager) { // 0: ShirkNeko/SukiSU, 1: Dynamic Sign if (matched_index == 0 || matched_index == 1) { - pr_info("Multi-manager APK detected (dynamic_sign enabled): signature_index=%d\n", matched_index); + pr_info("Multi-manager APK detected (dynamic_manager enabled): signature_index=%d\n", matched_index); return true; } return false; @@ -369,7 +369,7 @@ bool is_manager_apk(char *path) return check_v2_signature(path, false, NULL); } -bool ksu_is_multi_manager_apk(char *path, int *signature_index) +bool ksu_is_dynamic_manager_apk(char *path, int *signature_index) { return check_v2_signature(path, true, signature_index); } \ No newline at end of file diff --git a/kernel/core_hook.c b/kernel/core_hook.c index c32f833f..713ea7a3 100644 --- a/kernel/core_hook.c +++ b/kernel/core_hook.c @@ -45,7 +45,7 @@ #include "kernel_compat.h" #include "kpm/kpm.h" -#include "dynamic_sign.h" +#include "dynamic_manager.h" static bool ksu_module_mounted = false; @@ -345,31 +345,31 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, return 0; } - // Allow the root manager to configure dynamic signatures - if (arg2 == CMD_DYNAMIC_SIGN) { + // Allow the root manager to configure dynamic manageratures + if (arg2 == CMD_DYNAMIC_MANAGER) { if (!from_root && !from_manager) { return 0; } - struct dynamic_sign_user_config config; + struct dynamic_manager_user_config config; if (copy_from_user(&config, (void __user *)arg3, sizeof(config))) { - pr_err("copy dynamic sign config failed\n"); + pr_err("copy dynamic manager config failed\n"); return 0; } - int ret = ksu_handle_dynamic_sign(&config); + int ret = ksu_handle_dynamic_manager(&config); - if (ret == 0 && config.operation == DYNAMIC_SIGN_OP_GET) { + if (ret == 0 && config.operation == DYNAMIC_MANAGER_OP_GET) { if (copy_to_user((void __user *)arg3, &config, sizeof(config))) { - pr_err("copy dynamic sign config back failed\n"); + pr_err("copy dynamic manager config back failed\n"); return 0; } } if (ret == 0) { if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) { - pr_err("dynamic_sign: prctl reply error\n"); + pr_err("dynamic_manager: prctl reply error\n"); } } return 0; @@ -408,7 +408,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, pr_info("post-fs-data triggered\n"); on_post_fs_data(); // Initializing Dynamic Signatures - ksu_dynamic_sign_init(); + ksu_dynamic_manager_init(); pr_info("Dynamic sign config loaded during post-fs-data\n"); } break; diff --git a/kernel/dynamic_sign.c b/kernel/dynamic_manager.c similarity index 65% rename from kernel/dynamic_sign.c rename to kernel/dynamic_manager.c index 56c9b9e1..02d38133 100644 --- a/kernel/dynamic_sign.c +++ b/kernel/dynamic_manager.c @@ -15,7 +15,7 @@ #include #endif -#include "dynamic_sign.h" +#include "dynamic_manager.h" #include "klog.h" // IWYU pragma: keep #include "kernel_compat.h" #include "manager.h" @@ -23,7 +23,7 @@ #define MAX_MANAGERS 2 // Dynamic sign configuration -static struct dynamic_sign_config dynamic_sign = { +static struct dynamic_manager_config dynamic_manager = { .size = 0x300, .hash = "0000000000000000000000000000000000000000000000000000000000000000", .is_set = 0 @@ -32,21 +32,21 @@ static struct dynamic_sign_config dynamic_sign = { // Multi-manager state static struct manager_info active_managers[MAX_MANAGERS]; static DEFINE_SPINLOCK(managers_lock); -static DEFINE_SPINLOCK(dynamic_sign_lock); +static DEFINE_SPINLOCK(dynamic_manager_lock); // Work queues for persistent storage -static struct work_struct ksu_save_dynamic_sign_work; -static struct work_struct ksu_load_dynamic_sign_work; -static struct work_struct ksu_clear_dynamic_sign_work; +static struct work_struct ksu_save_dynamic_manager_work; +static struct work_struct ksu_load_dynamic_manager_work; +static struct work_struct ksu_clear_dynamic_manager_work; -bool ksu_is_dynamic_sign_enabled(void) +bool ksu_is_dynamic_manager_enabled(void) { unsigned long flags; bool enabled; - spin_lock_irqsave(&dynamic_sign_lock, flags); - enabled = dynamic_sign.is_set; - spin_unlock_irqrestore(&dynamic_sign_lock, flags); + spin_lock_irqsave(&dynamic_manager_lock, flags); + enabled = dynamic_manager.is_set; + spin_unlock_irqrestore(&dynamic_manager_lock, flags); return enabled; } @@ -56,7 +56,7 @@ void ksu_add_manager(uid_t uid, int signature_index) unsigned long flags; int i; - if (!ksu_is_dynamic_sign_enabled()) { + if (!ksu_is_dynamic_manager_enabled()) { pr_info("Dynamic sign not enabled, skipping multi-manager add\n"); return; } @@ -94,7 +94,7 @@ void ksu_remove_manager(uid_t uid) unsigned long flags; int i; - if (!ksu_is_dynamic_sign_enabled()) { + if (!ksu_is_dynamic_manager_enabled()) { return; } @@ -117,7 +117,7 @@ bool ksu_is_any_manager(uid_t uid) bool is_manager = false; int i; - if (!ksu_is_dynamic_sign_enabled()) { + if (!ksu_is_dynamic_manager_enabled()) { return false; } @@ -145,7 +145,7 @@ int ksu_get_manager_signature_index(uid_t uid) return 1; } - if (!ksu_is_dynamic_sign_enabled()) { + if (!ksu_is_dynamic_manager_enabled()) { return -1; } @@ -197,7 +197,7 @@ int ksu_get_active_managers(struct manager_list_info *info) } // Add dynamic managers - if (ksu_is_dynamic_sign_enabled()) { + if (ksu_is_dynamic_manager_enabled()) { spin_lock_irqsave(&managers_lock, flags); for (i = 0; i < MAX_MANAGERS && count < 2; i++) { @@ -215,42 +215,42 @@ int ksu_get_active_managers(struct manager_list_info *info) return 0; } -static void do_save_dynamic_sign(struct work_struct *work) +static void do_save_dynamic_manager(struct work_struct *work) { - u32 magic = DYNAMIC_SIGN_FILE_MAGIC; - u32 version = DYNAMIC_SIGN_FILE_VERSION; - struct dynamic_sign_config config_to_save; + u32 magic = DYNAMIC_MANAGER_FILE_MAGIC; + u32 version = DYNAMIC_MANAGER_FILE_VERSION; + struct dynamic_manager_config config_to_save; loff_t off = 0; unsigned long flags; struct file *fp; - spin_lock_irqsave(&dynamic_sign_lock, flags); - config_to_save = dynamic_sign; - spin_unlock_irqrestore(&dynamic_sign_lock, flags); + spin_lock_irqsave(&dynamic_manager_lock, flags); + config_to_save = dynamic_manager; + spin_unlock_irqrestore(&dynamic_manager_lock, flags); if (!config_to_save.is_set) { pr_info("Dynamic sign config not set, skipping save\n"); return; } - fp = ksu_filp_open_compat(KERNEL_SU_DYNAMIC_SIGN, O_WRONLY | O_CREAT | O_TRUNC, 0644); + fp = ksu_filp_open_compat(KERNEL_SU_DYNAMIC_MANAGER, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (IS_ERR(fp)) { - pr_err("save_dynamic_sign create file failed: %ld\n", PTR_ERR(fp)); + pr_err("save_dynamic_manager create file failed: %ld\n", PTR_ERR(fp)); return; } if (ksu_kernel_write_compat(fp, &magic, sizeof(magic), &off) != sizeof(magic)) { - pr_err("save_dynamic_sign write magic failed.\n"); + pr_err("save_dynamic_manager write magic failed.\n"); goto exit; } if (ksu_kernel_write_compat(fp, &version, sizeof(version), &off) != sizeof(version)) { - pr_err("save_dynamic_sign write version failed.\n"); + pr_err("save_dynamic_manager write version failed.\n"); goto exit; } if (ksu_kernel_write_compat(fp, &config_to_save, sizeof(config_to_save), &off) != sizeof(config_to_save)) { - pr_err("save_dynamic_sign write config failed.\n"); + pr_err("save_dynamic_manager write config failed.\n"); goto exit; } @@ -260,48 +260,48 @@ exit: filp_close(fp, 0); } -static void do_load_dynamic_sign(struct work_struct *work) +static void do_load_dynamic_manager(struct work_struct *work) { loff_t off = 0; ssize_t ret = 0; struct file *fp = NULL; u32 magic; u32 version; - struct dynamic_sign_config loaded_config; + struct dynamic_manager_config loaded_config; unsigned long flags; int i; - fp = ksu_filp_open_compat(KERNEL_SU_DYNAMIC_SIGN, O_RDONLY, 0); + fp = ksu_filp_open_compat(KERNEL_SU_DYNAMIC_MANAGER, O_RDONLY, 0); if (IS_ERR(fp)) { if (PTR_ERR(fp) == -ENOENT) { - pr_info("No saved dynamic sign config found\n"); + pr_info("No saved dynamic manager config found\n"); } else { - pr_err("load_dynamic_sign open file failed: %ld\n", PTR_ERR(fp)); + pr_err("load_dynamic_manager open file failed: %ld\n", PTR_ERR(fp)); } return; } if (ksu_kernel_read_compat(fp, &magic, sizeof(magic), &off) != sizeof(magic) || - magic != DYNAMIC_SIGN_FILE_MAGIC) { - pr_err("dynamic sign file invalid magic: %x!\n", magic); + magic != DYNAMIC_MANAGER_FILE_MAGIC) { + pr_err("dynamic manager file invalid magic: %x!\n", magic); goto exit; } if (ksu_kernel_read_compat(fp, &version, sizeof(version), &off) != sizeof(version)) { - pr_err("dynamic sign read version failed\n"); + pr_err("dynamic manager read version failed\n"); goto exit; } - pr_info("dynamic sign file version: %d\n", version); + pr_info("dynamic manager file version: %d\n", version); ret = ksu_kernel_read_compat(fp, &loaded_config, sizeof(loaded_config), &off); if (ret <= 0) { - pr_info("load_dynamic_sign read err: %zd\n", ret); + pr_info("load_dynamic_manager read err: %zd\n", ret); goto exit; } if (ret != sizeof(loaded_config)) { - pr_err("load_dynamic_sign read incomplete config: %zd/%zu\n", ret, sizeof(loaded_config)); + pr_err("load_dynamic_manager read incomplete config: %zd/%zu\n", ret, sizeof(loaded_config)); goto exit; } @@ -324,9 +324,9 @@ static void do_load_dynamic_sign(struct work_struct *work) } } - spin_lock_irqsave(&dynamic_sign_lock, flags); - dynamic_sign = loaded_config; - spin_unlock_irqrestore(&dynamic_sign_lock, flags); + spin_lock_irqsave(&dynamic_manager_lock, flags); + dynamic_manager = loaded_config; + spin_unlock_irqrestore(&dynamic_manager_lock, flags); pr_info("Dynamic sign config loaded: size=0x%x, hash=%.16s...\n", loaded_config.size, loaded_config.hash); @@ -335,12 +335,12 @@ exit: filp_close(fp, 0); } -static bool persistent_dynamic_sign(void) +static bool persistent_dynamic_manager(void) { - return ksu_queue_work(&ksu_save_dynamic_sign_work); + return ksu_queue_work(&ksu_save_dynamic_manager_work); } -static void do_clear_dynamic_sign(struct work_struct *work) +static void do_clear_dynamic_manager(struct work_struct *work) { loff_t off = 0; struct file *fp; @@ -348,15 +348,15 @@ static void do_clear_dynamic_sign(struct work_struct *work) memset(zero_buffer, 0, sizeof(zero_buffer)); - fp = ksu_filp_open_compat(KERNEL_SU_DYNAMIC_SIGN, O_WRONLY | O_CREAT | O_TRUNC, 0644); + fp = ksu_filp_open_compat(KERNEL_SU_DYNAMIC_MANAGER, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (IS_ERR(fp)) { - pr_err("clear_dynamic_sign create file failed: %ld\n", PTR_ERR(fp)); + pr_err("clear_dynamic_manager create file failed: %ld\n", PTR_ERR(fp)); return; } // Write null bytes to overwrite the file content if (ksu_kernel_write_compat(fp, zero_buffer, sizeof(zero_buffer), &off) != sizeof(zero_buffer)) { - pr_err("clear_dynamic_sign write null bytes failed.\n"); + pr_err("clear_dynamic_manager write null bytes failed.\n"); } else { pr_info("Dynamic sign config file cleared successfully\n"); } @@ -364,12 +364,12 @@ static void do_clear_dynamic_sign(struct work_struct *work) filp_close(fp, 0); } -static bool clear_dynamic_sign_file(void) +static bool clear_dynamic_manager_file(void) { - return ksu_queue_work(&ksu_clear_dynamic_sign_work); + return ksu_queue_work(&ksu_clear_dynamic_manager_work); } -int ksu_handle_dynamic_sign(struct dynamic_sign_user_config *config) +int ksu_handle_dynamic_manager(struct dynamic_manager_user_config *config) { unsigned long flags; int ret = 0; @@ -380,7 +380,7 @@ int ksu_handle_dynamic_sign(struct dynamic_sign_user_config *config) } switch (config->operation) { - case DYNAMIC_SIGN_OP_SET: + case DYNAMIC_MANAGER_OP_SET: if (config->size < 0x100 || config->size > 0x1000) { pr_err("invalid size: 0x%x\n", config->size); return -EINVAL; @@ -400,106 +400,106 @@ int ksu_handle_dynamic_sign(struct dynamic_sign_user_config *config) } } - spin_lock_irqsave(&dynamic_sign_lock, flags); - dynamic_sign.size = config->size; + spin_lock_irqsave(&dynamic_manager_lock, flags); + dynamic_manager.size = config->size; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0) - strscpy(dynamic_sign.hash, config->hash, sizeof(dynamic_sign.hash)); + strscpy(dynamic_manager.hash, config->hash, sizeof(dynamic_manager.hash)); #else - strlcpy(dynamic_sign.hash, config->hash, sizeof(dynamic_sign.hash)); + strlcpy(dynamic_manager.hash, config->hash, sizeof(dynamic_manager.hash)); #endif - dynamic_sign.is_set = 1; - spin_unlock_irqrestore(&dynamic_sign_lock, flags); + dynamic_manager.is_set = 1; + spin_unlock_irqrestore(&dynamic_manager_lock, flags); - persistent_dynamic_sign(); - pr_info("dynamic sign updated: size=0x%x, hash=%.16s... (multi-manager enabled)\n", + persistent_dynamic_manager(); + pr_info("dynamic manager updated: size=0x%x, hash=%.16s... (multi-manager enabled)\n", config->size, config->hash); break; - case DYNAMIC_SIGN_OP_GET: - spin_lock_irqsave(&dynamic_sign_lock, flags); - if (dynamic_sign.is_set) { - config->size = dynamic_sign.size; + case DYNAMIC_MANAGER_OP_GET: + spin_lock_irqsave(&dynamic_manager_lock, flags); + if (dynamic_manager.is_set) { + config->size = dynamic_manager.size; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0) - strscpy(config->hash, dynamic_sign.hash, sizeof(config->hash)); + strscpy(config->hash, dynamic_manager.hash, sizeof(config->hash)); #else - strlcpy(config->hash, dynamic_sign.hash, sizeof(config->hash)); + strlcpy(config->hash, dynamic_manager.hash, sizeof(config->hash)); #endif ret = 0; } else { ret = -ENODATA; } - spin_unlock_irqrestore(&dynamic_sign_lock, flags); + spin_unlock_irqrestore(&dynamic_manager_lock, flags); break; - case DYNAMIC_SIGN_OP_CLEAR: - spin_lock_irqsave(&dynamic_sign_lock, flags); - dynamic_sign.size = 0x300; - strcpy(dynamic_sign.hash, "0000000000000000000000000000000000000000000000000000000000000000"); - dynamic_sign.is_set = 0; - spin_unlock_irqrestore(&dynamic_sign_lock, flags); + case DYNAMIC_MANAGER_OP_CLEAR: + spin_lock_irqsave(&dynamic_manager_lock, flags); + dynamic_manager.size = 0x300; + strcpy(dynamic_manager.hash, "0000000000000000000000000000000000000000000000000000000000000000"); + dynamic_manager.is_set = 0; + spin_unlock_irqrestore(&dynamic_manager_lock, flags); // Clear only dynamic managers, preserve default manager clear_dynamic_manager(); // Clear file using the same method as save - clear_dynamic_sign_file(); + clear_dynamic_manager_file(); pr_info("Dynamic sign config cleared (multi-manager disabled)\n"); break; default: - pr_err("Invalid dynamic sign operation: %d\n", config->operation); + pr_err("Invalid dynamic manager operation: %d\n", config->operation); return -EINVAL; } return ret; } -bool ksu_load_dynamic_sign(void) +bool ksu_load_dynamic_manager(void) { - return ksu_queue_work(&ksu_load_dynamic_sign_work); + return ksu_queue_work(&ksu_load_dynamic_manager_work); } -void ksu_dynamic_sign_init(void) +void ksu_dynamic_manager_init(void) { int i; - INIT_WORK(&ksu_save_dynamic_sign_work, do_save_dynamic_sign); - INIT_WORK(&ksu_load_dynamic_sign_work, do_load_dynamic_sign); - INIT_WORK(&ksu_clear_dynamic_sign_work, do_clear_dynamic_sign); + INIT_WORK(&ksu_save_dynamic_manager_work, do_save_dynamic_manager); + INIT_WORK(&ksu_load_dynamic_manager_work, do_load_dynamic_manager); + INIT_WORK(&ksu_clear_dynamic_manager_work, do_clear_dynamic_manager); // Initialize manager slots for (i = 0; i < MAX_MANAGERS; i++) { active_managers[i].is_active = false; } - ksu_load_dynamic_sign(); + ksu_load_dynamic_manager(); pr_info("Dynamic sign initialized with conditional multi-manager support\n"); } -void ksu_dynamic_sign_exit(void) +void ksu_dynamic_manager_exit(void) { clear_dynamic_manager(); // Save current config before exit - do_save_dynamic_sign(NULL); + do_save_dynamic_manager(NULL); pr_info("Dynamic sign exited with persistent storage\n"); } -// Get dynamic sign configuration for signature verification -bool ksu_get_dynamic_sign_config(unsigned int *size, const char **hash) +// Get dynamic manager configuration for signature verification +bool ksu_get_dynamic_manager_config(unsigned int *size, const char **hash) { unsigned long flags; bool valid = false; - spin_lock_irqsave(&dynamic_sign_lock, flags); - if (dynamic_sign.is_set) { - if (size) *size = dynamic_sign.size; - if (hash) *hash = dynamic_sign.hash; + spin_lock_irqsave(&dynamic_manager_lock, flags); + if (dynamic_manager.is_set) { + if (size) *size = dynamic_manager.size; + if (hash) *hash = dynamic_manager.hash; valid = true; } - spin_unlock_irqrestore(&dynamic_sign_lock, flags); + spin_unlock_irqrestore(&dynamic_manager_lock, flags); return valid; } \ No newline at end of file diff --git a/kernel/dynamic_manager.h b/kernel/dynamic_manager.h new file mode 100644 index 00000000..1c82b692 --- /dev/null +++ b/kernel/dynamic_manager.h @@ -0,0 +1,43 @@ +#ifndef __KSU_H_DYNAMIC_MANAGER +#define __KSU_H_DYNAMIC_MANAGER + +#include +#include "ksu.h" + +#define DYNAMIC_MANAGER_FILE_MAGIC 0x7f445347 // 'DSG', u32 +#define DYNAMIC_MANAGER_FILE_VERSION 1 // u32 +#define KERNEL_SU_DYNAMIC_MANAGER "/data/adb/ksu/.dynamic_manager" + +struct dynamic_manager_config { + unsigned int size; + char hash[65]; + int is_set; +}; + +struct manager_info { + uid_t uid; + int signature_index; + bool is_active; +}; + +// Dynamic sign operations +void ksu_dynamic_manager_init(void); +void ksu_dynamic_manager_exit(void); +int ksu_handle_dynamic_manager(struct dynamic_manager_user_config *config); +bool ksu_load_dynamic_manager(void); +bool ksu_is_dynamic_manager_enabled(void); + +// Multi-manager operations +void ksu_add_manager(uid_t uid, int signature_index); +void ksu_remove_manager(uid_t uid); +bool ksu_is_any_manager(uid_t uid); +int ksu_get_manager_signature_index(uid_t uid); +int ksu_get_active_managers(struct manager_list_info *info); + +// Multi-manager APK verification +bool ksu_is_dynamic_manager_apk(char *path, int *signature_index); + +// Configuration access for signature verification +bool ksu_get_dynamic_manager_config(unsigned int *size, const char **hash); + +#endif \ No newline at end of file diff --git a/kernel/dynamic_sign.h b/kernel/dynamic_sign.h deleted file mode 100644 index eadbfea5..00000000 --- a/kernel/dynamic_sign.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __KSU_H_DYNAMIC_SIGN -#define __KSU_H_DYNAMIC_SIGN - -#include -#include "ksu.h" - -#define DYNAMIC_SIGN_FILE_MAGIC 0x7f445347 // 'DSG', u32 -#define DYNAMIC_SIGN_FILE_VERSION 1 // u32 -#define KERNEL_SU_DYNAMIC_SIGN "/data/adb/ksu/.dynamic_sign" - -struct dynamic_sign_config { - unsigned int size; - char hash[65]; - int is_set; -}; - -struct manager_info { - uid_t uid; - int signature_index; - bool is_active; -}; - -// Dynamic sign operations -int ksu_handle_dynamic_sign(struct dynamic_sign_user_config *config); -void ksu_dynamic_sign_init(void); -void ksu_dynamic_sign_exit(void); -bool ksu_load_dynamic_sign(void); -bool ksu_is_dynamic_sign_enabled(void); - -// Multi-manager operations -void ksu_add_manager(uid_t uid, int signature_index); -void ksu_remove_manager(uid_t uid); -bool ksu_is_any_manager(uid_t uid); -int ksu_get_manager_signature_index(uid_t uid); -int ksu_get_active_managers(struct manager_list_info *info); - -// Multi-manager APK verification -bool ksu_is_multi_manager_apk(char *path, int *signature_index); - -// Configuration access for signature verification -bool ksu_get_dynamic_sign_config(unsigned int *size, const char **hash); - -#endif \ No newline at end of file diff --git a/kernel/ksu.h b/kernel/ksu.h index 257ee096..53201802 100644 --- a/kernel/ksu.h +++ b/kernel/ksu.h @@ -28,7 +28,7 @@ #define CMD_ENABLE_KPM 100 #define CMD_HOOK_TYPE 101 -#define CMD_DYNAMIC_SIGN 103 +#define CMD_DYNAMIC_MANAGER 103 #define CMD_GET_MANAGERS 104 #define EVENT_POST_FS_DATA 1 @@ -47,11 +47,11 @@ #endif #define KSU_FULL_VERSION_STRING 255 -#define DYNAMIC_SIGN_OP_SET 0 -#define DYNAMIC_SIGN_OP_GET 1 -#define DYNAMIC_SIGN_OP_CLEAR 2 +#define DYNAMIC_MANAGER_OP_SET 0 +#define DYNAMIC_MANAGER_OP_GET 1 +#define DYNAMIC_MANAGER_OP_CLEAR 2 -struct dynamic_sign_user_config { +struct dynamic_manager_user_config { unsigned int operation; unsigned int size; char hash[65]; diff --git a/kernel/throne_tracker.c b/kernel/throne_tracker.c index d72de583..d5c57ed7 100644 --- a/kernel/throne_tracker.c +++ b/kernel/throne_tracker.c @@ -12,7 +12,7 @@ #include "manager.h" #include "throne_tracker.h" #include "kernel_compat.h" -#include "dynamic_sign.h" +#include "dynamic_manager.h" uid_t ksu_manager_uid = KSU_INVALID_UID; @@ -196,7 +196,7 @@ FILLDIR_RETURN_TYPE my_actor(struct dir_context *ctx, const char *name, } int signature_index = -1; - bool is_multi_manager = ksu_is_multi_manager_apk(dirpath, &signature_index); + bool is_multi_manager = ksu_is_dynamic_manager_apk(dirpath, &signature_index); pr_info("Found new base.apk at path: %s, is_multi_manager: %d, signature_index: %d\n", dirpath, is_multi_manager, signature_index); @@ -401,7 +401,7 @@ void track_throne() } // Check for dynamic managers - if (!dynamic_manager_exist && ksu_is_dynamic_sign_enabled()) { + if (!dynamic_manager_exist && ksu_is_dynamic_manager_enabled()) { list_for_each_entry (np, &uid_list, list) { if (ksu_is_any_manager(np->uid)) { dynamic_manager_exist = true; @@ -419,8 +419,8 @@ void track_throne() pr_info("Searching manager...\n"); search_manager("/data/app", 2, &uid_list); pr_info("Search manager finished\n"); - } else if (!dynamic_manager_exist && ksu_is_dynamic_sign_enabled()) { - // Always perform search when called from dynamic sign rescan + } else if (!dynamic_manager_exist && ksu_is_dynamic_manager_enabled()) { + // Always perform search when called from dynamic manager rescan pr_info("Dynamic sign enabled, Searching manager...\n"); search_manager("/data/app", 2, &uid_list); pr_info("Search Dynamic sign manager finished\n"); diff --git a/manager/app/src/main/cpp/jni.c b/manager/app/src/main/cpp/jni.c index bab638f7..28627634 100644 --- a/manager/app/src/main/cpp/jni.c +++ b/manager/app/src/main/cpp/jni.c @@ -341,43 +341,43 @@ NativeBridgeNP(getSusfsFeatureStatus, jobject) { return obj; } -// dynamic sign -NativeBridge(setDynamicSign, jboolean, jint size, jstring hash) { +// dynamic manager +NativeBridge(setDynamicManager, jboolean, jint size, jstring hash) { if (!hash) { - LogDebug("setDynamicSign: hash is null"); + LogDebug("setDynamicManager: hash is null"); return false; } const char* chash = GetEnvironment()->GetStringUTFChars(env, hash, nullptr); - bool result = set_dynamic_sign((unsigned int)size, chash); + bool result = set_dynamic_manager((unsigned int)size, chash); GetEnvironment()->ReleaseStringUTFChars(env, hash, chash); - LogDebug("setDynamicSign: size=0x%x, result=%d", size, result); + LogDebug("setDynamicManager: size=0x%x, result=%d", size, result); return result; } -NativeBridgeNP(getDynamicSign, jobject) { - struct dynamic_sign_user_config config; - bool result = get_dynamic_sign(&config); +NativeBridgeNP(getDynamicManager, jobject) { + struct dynamic_manager_user_config config; + bool result = get_dynamic_manager(&config); if (!result) { - LogDebug("getDynamicSign: failed to get dynamic sign config"); + LogDebug("getDynamicManager: failed to get dynamic manager config"); return NULL; } - jobject obj = CREATE_JAVA_OBJECT("com/sukisu/ultra/Natives$DynamicSignConfig"); - jclass cls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$DynamicSignConfig"); + jobject obj = CREATE_JAVA_OBJECT("com/sukisu/ultra/Natives$DynamicManagerConfig"); + jclass cls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$DynamicManagerConfig"); SET_INT_FIELD(obj, cls, size, (jint)config.size); SET_STRING_FIELD(obj, cls, hash, config.hash); - LogDebug("getDynamicSign: size=0x%x, hash=%.16s...", config.size, config.hash); + LogDebug("getDynamicManager: size=0x%x, hash=%.16s...", config.size, config.hash); return obj; } -NativeBridgeNP(clearDynamicSign, jboolean) { - bool result = clear_dynamic_sign(); - LogDebug("clearDynamicSign: result=%d", result); +NativeBridgeNP(clearDynamicManager, jboolean) { + bool result = clear_dynamic_manager(); + LogDebug("clearDynamicManager: result=%d", result); return result; } diff --git a/manager/app/src/main/cpp/ksu.c b/manager/app/src/main/cpp/ksu.c index 977e9109..7c5a0479 100644 --- a/manager/app/src/main/cpp/ksu.c +++ b/manager/app/src/main/cpp/ksu.c @@ -46,12 +46,12 @@ extern const char* zako_file_verrcidx2str(uint8_t index); #define CMD_ENABLE_KPM 100 #define CMD_HOOK_TYPE 101 #define CMD_GET_SUSFS_FEATURE_STATUS 102 -#define CMD_DYNAMIC_SIGN 103 +#define CMD_DYNAMIC_MANAGER 103 #define CMD_GET_MANAGERS 104 -#define DYNAMIC_SIGN_OP_SET 0 -#define DYNAMIC_SIGN_OP_GET 1 -#define DYNAMIC_SIGN_OP_CLEAR 2 +#define DYNAMIC_MANAGER_OP_SET 0 +#define DYNAMIC_MANAGER_OP_GET 1 +#define DYNAMIC_MANAGER_OP_CLEAR 2 static bool ksuctl(int cmd, void* arg1, void* arg2) { int32_t result = 0; @@ -157,33 +157,33 @@ bool get_susfs_feature_status(struct susfs_feature_status* status) { return ksuctl(CMD_GET_SUSFS_FEATURE_STATUS, status, NULL); } -bool set_dynamic_sign(unsigned int size, const char* hash) { +bool set_dynamic_manager(unsigned int size, const char* hash) { if (hash == NULL) { return false; } - struct dynamic_sign_user_config config; - config.operation = DYNAMIC_SIGN_OP_SET; + struct dynamic_manager_user_config config; + config.operation = DYNAMIC_MANAGER_OP_SET; config.size = size; strncpy(config.hash, hash, sizeof(config.hash) - 1); config.hash[sizeof(config.hash) - 1] = '\0'; - return ksuctl(CMD_DYNAMIC_SIGN, &config, NULL); + return ksuctl(CMD_DYNAMIC_MANAGER, &config, NULL); } -bool get_dynamic_sign(struct dynamic_sign_user_config* config) { +bool get_dynamic_manager(struct dynamic_manager_user_config* config) { if (config == NULL) { return false; } - config->operation = DYNAMIC_SIGN_OP_GET; - return ksuctl(CMD_DYNAMIC_SIGN, config, NULL); + config->operation = DYNAMIC_MANAGER_OP_GET; + return ksuctl(CMD_DYNAMIC_MANAGER, config, NULL); } -bool clear_dynamic_sign() { - struct dynamic_sign_user_config config; - config.operation = DYNAMIC_SIGN_OP_CLEAR; - return ksuctl(CMD_DYNAMIC_SIGN, &config, NULL); +bool clear_dynamic_manager() { + struct dynamic_manager_user_config config; + config.operation = DYNAMIC_MANAGER_OP_CLEAR; + return ksuctl(CMD_DYNAMIC_MANAGER, &config, NULL); } bool get_managers_list(struct manager_list_info* info) { diff --git a/manager/app/src/main/cpp/ksu.h b/manager/app/src/main/cpp/ksu.h index c9c84411..b12b4d2d 100644 --- a/manager/app/src/main/cpp/ksu.h +++ b/manager/app/src/main/cpp/ksu.h @@ -29,11 +29,11 @@ bool is_lkm_mode(); #define KSU_MAX_GROUPS 32 #define KSU_SELINUX_DOMAIN 64 -#define DYNAMIC_SIGN_OP_SET 0 -#define DYNAMIC_SIGN_OP_GET 1 -#define DYNAMIC_SIGN_OP_CLEAR 2 +#define DYNAMIC_MANAGER_OP_SET 0 +#define DYNAMIC_MANAGER_OP_GET 1 +#define DYNAMIC_MANAGER_OP_CLEAR 2 -struct dynamic_sign_user_config { +struct dynamic_manager_user_config { unsigned int operation; unsigned int size; char hash[65]; @@ -128,11 +128,11 @@ bool get_hook_type(char* hook_type, size_t size); bool get_susfs_feature_status(struct susfs_feature_status* status); -bool set_dynamic_sign(unsigned int size, const char* hash); +bool set_dynamic_manager(unsigned int size, const char* hash); -bool get_dynamic_sign(struct dynamic_sign_user_config* config); +bool get_dynamic_manager(struct dynamic_manager_user_config* config); -bool clear_dynamic_sign(); +bool clear_dynamic_manager(); bool get_managers_list(struct manager_list_info* info); diff --git a/manager/app/src/main/java/com/sukisu/ultra/Natives.kt b/manager/app/src/main/java/com/sukisu/ultra/Natives.kt index 4b4cbb3b..f934d192 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/Natives.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/Natives.kt @@ -29,7 +29,7 @@ object Natives { const val MINIMAL_SUPPORTED_KPM = 12800 - const val MINIMAL_SUPPORTED_DYNAMIC_SIGN = 13215 + const val MINIMAL_SUPPORTED_DYNAMIC_MANAGER = 13215 const val ROOT_UID = 0 const val ROOT_GID = 0 @@ -107,28 +107,28 @@ object Natives { external fun getSusfsFeatureStatus(): SusfsFeatureStatus? /** - * Set dynamic signature configuration + * Set dynamic managerature configuration * @param size APK signature size * @param hash APK signature hash (64 character hex string) * @return true if successful, false otherwise */ - external fun setDynamicSign(size: Int, hash: String): Boolean + external fun setDynamicManager(size: Int, hash: String): Boolean /** - * Get current dynamic signature configuration - * @return DynamicSignConfig object containing current configuration, or null if not set + * Get current dynamic managerature configuration + * @return DynamicManagerConfig object containing current configuration, or null if not set */ - external fun getDynamicSign(): DynamicSignConfig? + external fun getDynamicManager(): DynamicManagerConfig? /** - * Clear dynamic signature configuration + * Clear dynamic managerature configuration * @return true if successful, false otherwise */ - external fun clearDynamicSign(): Boolean + external fun clearDynamicManager(): Boolean /** - * Get active managers list when dynamic sign is enabled + * Get active managers list when dynamic manager is enabled * @return ManagersList object containing active managers, or null if failed or not enabled */ external fun getManagersList(): ManagersList? @@ -185,7 +185,7 @@ object Natives { @Immutable @Parcelize @Keep - data class DynamicSignConfig( + data class DynamicManagerConfig( val size: Int = 0, val hash: String = "" ) : Parcelable { diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Home.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Home.kt index bba1e226..0e61f504 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Home.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Home.kt @@ -747,7 +747,7 @@ private fun InfoCard( append( when (signatureIndex) { 0 -> "(${stringResource(R.string.default_signature)})" - 1 -> "(${stringResource(R.string.dynamic_signature)})" + 1 -> "(${stringResource(R.string.dynamic_managerature)})" else -> if (signatureIndex >= 2) "(${ stringResource( R.string.signature_index, diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/viewmodel/HomeViewModel.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/viewmodel/HomeViewModel.kt index 9274171e..8ccf7c82 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/viewmodel/HomeViewModel.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/viewmodel/HomeViewModel.kt @@ -431,18 +431,18 @@ class HomeViewModel : ViewModel() { } } - // 获取动态签名状态和管理器列表 + // 获取动态管理器状态和管理器列表 val dynamicSignConfig = try { - Natives.getDynamicSign() + Natives.getDynamicManager() } catch (e: Exception) { - Log.w(TAG, "Failed to get dynamic sign config", e) + Log.w(TAG, "Failed to get dynamic manager config", e) null } val isDynamicSignEnabled = try { dynamicSignConfig?.isValid() == true } catch (e: Exception) { - Log.w(TAG, "Failed to check dynamic sign validity", e) + Log.w(TAG, "Failed to check dynamic manager validity", e) false } diff --git a/manager/app/src/main/java/zako/zako/zako/zakoui/screen/MoreSettings.kt b/manager/app/src/main/java/zako/zako/zako/zakoui/screen/MoreSettings.kt index 0efc52f5..25565cf7 100644 --- a/manager/app/src/main/java/zako/zako/zako/zakoui/screen/MoreSettings.kt +++ b/manager/app/src/main/java/zako/zako/zako/zakoui/screen/MoreSettings.kt @@ -148,8 +148,8 @@ fun MoreSettingsScreen( var showDpiConfirmDialog by remember { mutableStateOf(false) } var showImageEditor by remember { mutableStateOf(false) } - // 动态签名配置状态 - var dynamicSignConfig by remember { mutableStateOf(null) } + // 动态管理器配置状态 + var dynamicSignConfig by remember { mutableStateOf(null) } var isDynamicSignEnabled by remember { mutableStateOf(false) } var dynamicSignSize by remember { mutableStateOf("") } var dynamicSignHash by remember { mutableStateOf("") } @@ -674,8 +674,8 @@ fun MoreSettingsScreen( } LaunchedEffect(Unit) { - // 初始化动态签名配置 - dynamicSignConfig = Natives.getDynamicSign() + // 初始化动态管理器配置 + dynamicSignConfig = Natives.getDynamicManager() dynamicSignConfig?.let { config -> if (config.isValid()) { isDynamicSignEnabled = true @@ -696,11 +696,11 @@ fun MoreSettingsScreen( } } - // 动态签名配置对话框 + // 动态管理器配置对话框 if (showDynamicSignDialog) { AlertDialog( onDismissRequest = { showDynamicSignDialog = false }, - title = { Text(stringResource(R.string.dynamic_sign_title)) }, + title = { Text(stringResource(R.string.dynamic_manager_title)) }, text = { Column( modifier = Modifier.verticalScroll(rememberScrollState()) @@ -718,7 +718,7 @@ fun MoreSettingsScreen( onCheckedChange = { isDynamicSignEnabled = it } ) Spacer(modifier = Modifier.width(12.dp)) - Text(stringResource(R.string.enable_dynamic_sign)) + Text(stringResource(R.string.enable_dynamic_manager)) } Spacer(modifier = Modifier.height(16.dp)) @@ -773,18 +773,18 @@ fun MoreSettingsScreen( if (isDynamicSignEnabled) { val size = parseDynamicSignSize(dynamicSignSize) if (size != null && size > 0 && dynamicSignHash.length == 64) { - val success = Natives.setDynamicSign(size, dynamicSignHash) + val success = Natives.setDynamicManager(size, dynamicSignHash) if (success) { - dynamicSignConfig = Natives.DynamicSignConfig(size, dynamicSignHash) + dynamicSignConfig = Natives.DynamicManagerConfig(size, dynamicSignHash) Toast.makeText( context, - context.getString(R.string.dynamic_sign_set_success), + context.getString(R.string.dynamic_manager_set_success), Toast.LENGTH_SHORT ).show() } else { Toast.makeText( context, - context.getString(R.string.dynamic_sign_set_failed), + context.getString(R.string.dynamic_manager_set_failed), Toast.LENGTH_SHORT ).show() } @@ -797,20 +797,20 @@ fun MoreSettingsScreen( return@Button } } else { - val success = Natives.clearDynamicSign() + val success = Natives.clearDynamicManager() if (success) { dynamicSignConfig = null dynamicSignSize = "" dynamicSignHash = "" Toast.makeText( context, - context.getString(R.string.dynamic_sign_disabled_success), + context.getString(R.string.dynamic_manager_disabled_success), Toast.LENGTH_SHORT ).show() } else { Toast.makeText( context, - context.getString(R.string.dynamic_sign_clear_failed), + context.getString(R.string.dynamic_manager_clear_failed), Toast.LENGTH_SHORT ).show() return@Button @@ -1417,18 +1417,18 @@ fun MoreSettingsScreen( } ) } - // 动态签名设置 - if (Natives.version >= Natives.MINIMAL_SUPPORTED_DYNAMIC_SIGN) { + // 动态管理器设置 + if (Natives.version >= Natives.MINIMAL_SUPPORTED_DYNAMIC_MANAGER) { SettingItem( icon = Icons.Filled.Security, - title = stringResource(R.string.dynamic_sign_title), + title = stringResource(R.string.dynamic_manager_title), subtitle = if (isDynamicSignEnabled) { stringResource( - R.string.dynamic_sign_enabled_summary, + R.string.dynamic_manager_enabled_summary, dynamicSignSize ) } else { - stringResource(R.string.dynamic_sign_disabled) + stringResource(R.string.dynamic_manager_disabled) }, onClick = { showDynamicSignDialog = true } ) diff --git a/manager/app/src/main/res/values-in/strings.xml b/manager/app/src/main/res/values-in/strings.xml index 9078f419..073eb041 100644 --- a/manager/app/src/main/res/values-in/strings.xml +++ b/manager/app/src/main/res/values-in/strings.xml @@ -570,19 +570,19 @@ %1$d aplikasi dipilih %1$d aplikasi sudah ditambahkan Semua aplikasi telah ditambahkan - Konfigurasi Tanda Tangan Dinamis - Diaktifkan (Ukuran: %s) - Dinonaktifkan - Aktifkan Tanda Tangan Dinamis + Konfigurasi Tanda Tangan Dinamis + Diaktifkan (Ukuran: %s) + Dinonaktifkan + Aktifkan Tanda Tangan Dinamis Ukuran Tanda Tangan Hash Tanda Tangan Hash harus 64 karakter heksadesimal - Konfigurasi tanda tangan dinamis berhasil diatur - Gagal mengatur konfigurasi tanda tangan dinamis + Konfigurasi tanda tangan dinamis berhasil diatur + Gagal mengatur konfigurasi tanda tangan dinamis Konfigurasi tanda tangan tidak valid - Tanda tangan dinamis dinonaktifkan - Gagal membersihkan tanda tangan dinamis - Dinamis + Tanda tangan dinamis dinonaktifkan + Gagal membersihkan tanda tangan dinamis + Dinamis Tanda Tangan %1$d Tidak diketahui Manajer Aktif diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml index 39642568..6776cbd6 100644 --- a/manager/app/src/main/res/values-ja/strings.xml +++ b/manager/app/src/main/res/values-ja/strings.xml @@ -570,19 +570,19 @@ %1$d 個のアプリを選択済み %1$d 個のアプリを追加済み すべてのアプリが追加されました - 動的な署名の構成 - 有効 (サイズ: %s) - 無効 - 動的な署名を有効化 + 動的な署名の構成 + 有効 (サイズ: %s) + 無効 + 動的な署名を有効化 署名のサイズ 署名のハッシュ ハッシュは 64 桁の 16 進数の文字列でなければなりません。 - 動的な署名の構成が正常に設定されました - 動的な署名の構成の設定に失敗しました + 動的な署名の構成が正常に設定されました + 動的な署名の構成の設定に失敗しました 無効な署名の構成 - 動的な署名が無効です - 動的な署名の消去に失敗しました - 動的 + 動的な署名が無効です + 動的な署名の消去に失敗しました + 動的 署名 %1$d 不明 有効なマネージャー diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml index febdb127..5dedb4e1 100644 --- a/manager/app/src/main/res/values-ru/strings.xml +++ b/manager/app/src/main/res/values-ru/strings.xml @@ -570,19 +570,19 @@ Выбрано %1$d приложений %1$d приложений уже добавлено Все приложения были добавлены - Конфигурация динамической подписи - Включено (размер: %s) - Выключено - Включить динамическую подпись + Конфигурация динамической подписи + Включено (размер: %s) + Выключено + Включить динамическую подпись Размер подписи Хэш подписи Хеш должен содержать 64 шестнадцатеричных символа - Конфигурация динамической подписи успешно установлена - Не удалось установить конфигурацию динамической подписи + Конфигурация динамической подписи успешно установлена + Не удалось установить конфигурацию динамической подписи Неверная конфигурация подписи - Динамическая подпись отключена - Не удалось очистить динамическую подпись - Динамическая + Динамическая подпись отключена + Не удалось очистить динамическую подпись + Динамическая Подпись %1$d Неизвестно Активный менеджер diff --git a/manager/app/src/main/res/values-tr/strings.xml b/manager/app/src/main/res/values-tr/strings.xml index ec47926b..7f26c87e 100644 --- a/manager/app/src/main/res/values-tr/strings.xml +++ b/manager/app/src/main/res/values-tr/strings.xml @@ -568,19 +568,19 @@ %1$d uygulama seçildi %1$d uygulama zaten eklendi Tüm uygulamalar eklendi - Dinamik İmza Yapılandırması - Etkin (Boyut: %s) - Devre Dışı - Dinamik İmzayı Etkinleştir + Dinamik İmza Yapılandırması + Etkin (Boyut: %s) + Devre Dışı + Dinamik İmzayı Etkinleştir İmza Boyutu İmza Hash Hash, 64 adet onaltılık karakterden oluşmalıdır - Dinamik imza yapılandırması başarıyla ayarlandı - Dinamik imza yapılandırması ayarlanamadı + Dinamik imza yapılandırması başarıyla ayarlandı + Dinamik imza yapılandırması ayarlanamadı Geçersiz imza yapılandırması - Dinamik imza devre dışı bırakıldı - Dinamik imza temizlenemedi - Dinamik + Dinamik imza devre dışı bırakıldı + Dinamik imza temizlenemedi + Dinamik İmza %1$d Bilinmiyor Aktif Yönetici diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml index c6dfcfe9..44110c3d 100644 --- a/manager/app/src/main/res/values-vi/strings.xml +++ b/manager/app/src/main/res/values-vi/strings.xml @@ -568,19 +568,19 @@ %1$d ứng dụng đã chọn %1$d ứng dụng đã thêm Tất cả các ứng dụng đã được thêm vào - Cấu hình chữ ký động - Đã kích hoạt (Size: %s) - Đã vô hiệu hoá - Kích hoạt chữ ký động + Cấu hình chữ ký động + Đã kích hoạt (Size: %s) + Đã vô hiệu hoá + Kích hoạt chữ ký động Size chữ ký Hash chữ ký Hash phải dài 64 ký tự thập lục phân - Cấu hình chữ ký động đã được thiết lập thành công - Thiết lập cấu hình chữ ký động thất bại + Cấu hình chữ ký động đã được thiết lập thành công + Thiết lập cấu hình chữ ký động thất bại Cấu hình chữ ký không hợp lệ - Chữ ký động đã bị vô hiệu hoá - Xoá chữ ký động thất bại - Chữ ký động + Chữ ký động đã bị vô hiệu hoá + Xoá chữ ký động thất bại + Chữ ký động Chữ ký %1$d Không xác định Trình quản lý đang hoạt động diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml index 87a820e3..c5968f52 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -568,19 +568,19 @@ %1$d 个已选应用 %1$d 个已添加应用 所有应用均已添加 - 动态签名配置 - 已启用(大小: %s) - 未启用 - 启用动态签名 - 签名大小 - 签名哈希值 + 动态管理器配置 + 已启用(大小: %s) + 未启用 + 启用动态管理器 + 动态管理器签名大小 + 动态管理器签名哈希值 哈希值必须是 64 位十六进制字符 - 动态签名配置设置成功 - 动态签名配置设置失败 + 动态管理器配置设置成功 + 动态管理器配置设置失败 无效的签名配置 - 动态签名已禁用 - 清除动态签名错误 - 动态 + 动态管理器已禁用 + 清除动态管理器错误 + 动态 签名 %1$d 未知 活跃管理器 diff --git a/manager/app/src/main/res/values-zh-rHK/strings.xml b/manager/app/src/main/res/values-zh-rHK/strings.xml index 6e57d382..0590f09e 100644 --- a/manager/app/src/main/res/values-zh-rHK/strings.xml +++ b/manager/app/src/main/res/values-zh-rHK/strings.xml @@ -565,19 +565,19 @@ %1$d 個已選應用程式 %1$d 個已添加應用程式 所有应用均已添加 - 動態簽名配置 - 已啟用(大小: %s) - 未啟用 - 啟用動態簽名 + 動態簽名配置 + 已啟用(大小: %s) + 未啟用 + 啟用動態簽名 簽名大小 簽名哈希值 哈希值必須是 64 位十六進制字符 - 動態簽名配置設定成功 - 動態簽名配置設定失敗 + 動態簽名配置設定成功 + 動態簽名配置設定失敗 無效嘅簽名配置 - 動態簽名已禁用 - 清除動態簽名錯誤 - 動態 + 動態簽名已禁用 + 清除動態簽名錯誤 + 動態 簽名 %1$d 未知 活躍管理器 diff --git a/manager/app/src/main/res/values-zh-rTW/strings.xml b/manager/app/src/main/res/values-zh-rTW/strings.xml index 60afeff3..007d951f 100644 --- a/manager/app/src/main/res/values-zh-rTW/strings.xml +++ b/manager/app/src/main/res/values-zh-rTW/strings.xml @@ -568,19 +568,19 @@ %1$d 個已選應用程式 %1$d 個已添加應用程式 所有应用均已添加 - 动态签名配置 - 已启用(大小: %s) - 未启用 - 啟用動態簽名 + 动态签名配置 + 已启用(大小: %s) + 未启用 + 啟用動態簽名 簽名大小 簽名哈希值 哈希值必須是 64 位十六進制字符 - 動態簽名配置設定成功 - 動態簽名配置設定失敗 + 動態簽名配置設定成功 + 動態簽名配置設定失敗 無效的簽名配置 - 動態簽名已禁用 - 清除動態簽名錯誤 - 動態 + 動態簽名已禁用 + 清除動態簽名錯誤 + 動態 簽名 %1$d 未知 活躍管理器 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index a8a7607f..be898722 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -570,19 +570,19 @@ %1$d apps selected %1$d apps already added All apps have been added - Dynamic Signature Configuration - Enabled (Size: %s) - Disabled - Enable Dynamic Signature - Signature Size - Signature Hash + Dynamic Manager Configuration + Enabled (Size: %s) + Disabled + Enable Dynamic Manager + Dynamic Manager Signature Size + Dynamic Manager Signature Hash Hash must be 64 hexadecimal characters - Dynamic signature configuration set successfully - Failed to set dynamic signature configuration - Invalid signature configuration - Dynamic signature disabled - Failed to clear dynamic signature - Dynamic + Dynamic Manager configuration set successfully + Failed to set dynamic Manager configuration + Invalid Manager configuration + Dynamic Manager disabled + Failed to clear dynamic Manager + Dynamic Signature %1$d Unknown Active Manager