尝试修复

This commit is contained in:
liankong
2025-03-29 22:32:39 +08:00
parent 72b205fa5e
commit f11d57d2bd
2 changed files with 33 additions and 18 deletions

View File

@@ -31,7 +31,7 @@ unsigned long sukisu_compact_find_symbol(const char* name);
// ====================================================================== // ======================================================================
const char* kpver = "0.10"; const char* kver = "0.10";
struct CompactAddressSymbol { struct CompactAddressSymbol {
const char* symbol_name; const char* symbol_name;
@@ -45,18 +45,18 @@ struct CompactAliasSymbol {
struct CompactAddressSymbol address_symbol [] = { struct CompactAddressSymbol address_symbol [] = {
{ "kallsyms_lookup_name", &kallsyms_lookup_name }, { "kallsyms_lookup_name", &kallsyms_lookup_name },
{ "compat_find_symbol", &sukisu_compact_find_symbol }, { "compact_find_symbol", &sukisu_compact_find_symbol },
{ "compat_copy_to_user", &copy_to_user }, { "compact_copy_to_user", &copy_to_user },
{ "compat_strncpy_from_user", &strncpy_from_user }, { "compact_strncpy_from_user", &strncpy_from_user },
{ "kpver", &kpver }, { "kver", &kver },
{ "is_run_in_sukisu_ultra", (void*)1 } { "is_run_in_sukisu_ultra", (void*)1 }
}; };
struct CompactAliasSymbol alias_symbol[] = { struct CompactAliasSymbol alias_symbol[] = {
{"kf_strncat", "strncat"}, {"kf__strncat", "strncat"},
{"kf_strlen", "strlen" }, {"kf__strlen", "strlen" },
{"kf_strcpy", "strcpy"}, {"kf__strcpy", "strcpy"},
{"compat_copy_to_user", "__arch_copy_to_user"} {"compact_copy_to_user", "__arch_copy_to_user"}
}; };
unsigned long sukisu_compact_find_symbol(const char* name) { unsigned long sukisu_compact_find_symbol(const char* name) {

View File

@@ -598,36 +598,47 @@ static int kpm_setup_load_info(struct kpm_load_info *info)
* KPM 模块加载主流程 * KPM 模块加载主流程
*----------------------------------------------------------*/ *----------------------------------------------------------*/
/* 注意:接口名称改为 kpm_load_module避免与内核原有 load_module 冲突 */ /* 注意:接口名称改为 kpm_load_module避免与内核原有 load_module 冲突 */
long kpm_load_module(const void *data, int len, const char *args, const char *event, void *__user reserved) long kpm_load_module(const void *data, int len, const char *args,
const char *event, void *__user reserved)
{ {
struct kpm_load_info load_info = { .hdr = data, .len = len }; struct kpm_load_info load_info = { .hdr = data, .len = len };
long rc = 0; long rc = 0;
struct kpm_module *mod; struct kpm_module *mod;
/* 检查 ELF 头 */
rc = kpm_elf_header_check(&load_info); rc = kpm_elf_header_check(&load_info);
if (rc) if (rc)
goto out; goto out;
rc = kpm_setup_load_info(&load_info); rc = kpm_setup_load_info(&load_info);
if (rc) if (rc)
goto out; goto out;
if (find_sec_num(&load_info, ".kpm.init") == -1 || find_sec_num(&load_info, ".kpm.exit") == -1) {
/* 检查必须存在的模块初始化/退出段 */
if (find_sec_num(&load_info, ".kpm.init") == -1 ||
find_sec_num(&load_info, ".kpm.exit") == -1) {
printk(KERN_ERR "ARM64 KPM Loader: Required sections missing\n"); printk(KERN_ERR "ARM64 KPM Loader: Required sections missing\n");
rc = -ENOEXEC; rc = -ENOEXEC;
goto out; goto out;
} }
/* 检查模块是否已经加载 */
if (find_module(load_info.info.name)) { if (find_module(load_info.info.name)) {
printk(KERN_ERR "ARM64 KPM Loader: Module %s already loaded\n", load_info.info.name); printk(KERN_ERR "ARM64 KPM Loader: Module %s already loaded\n",
load_info.info.name);
rc = -EEXIST; rc = -EEXIST;
goto out; goto out;
} }
mod = vmalloc(sizeof(struct kpm_module)); mod = vmalloc(sizeof(struct kpm_module));
if (!mod) if (!mod) {
return -ENOMEM; rc = -ENOMEM;
goto out;
}
memset(mod, 0, sizeof(struct kpm_module)); memset(mod, 0, sizeof(struct kpm_module));
if (args) { if (args) {
mod->args = (typeof(mod->args)) vmalloc(strlen(args) + 1); mod->args = vmalloc(strlen(args) + 1);
if (!mod->args) { if (!mod->args) {
rc = -ENOMEM; rc = -ENOMEM;
goto free_mod; goto free_mod;
@@ -648,17 +659,21 @@ long kpm_load_module(const void *data, int len, const char *args, const char *ev
if (rc) if (rc)
goto free_mod; goto free_mod;
flush_icache_all(); /* 替换 flush_icache_all() 为 flush_icache_range() */
flush_icache_range((unsigned long)mod->start,
(unsigned long)mod->start + mod->size);
rc = mod->init(mod->args, event, reserved); rc = mod->init(mod->args, event, reserved);
if (!rc) { if (!rc) {
printk(KERN_INFO "ARM64 KPM Loader: Module [%s] loaded successfully with args [%s]\n", mod->info.name, args ? args : ""); printk(KERN_INFO "ARM64 KPM Loader: Module [%s] loaded successfully with args [%s]\n",
mod->info.name, args ? args : "");
spin_lock(&kpm_module_lock); spin_lock(&kpm_module_lock);
list_add_tail(&mod->list, &kpm_module_list); list_add_tail(&mod->list, &kpm_module_list);
spin_unlock(&kpm_module_lock); spin_unlock(&kpm_module_lock);
goto out; goto out;
} else { } else {
printk(KERN_ERR "ARM64 KPM Loader: Module [%s] init failed with error %ld\n", mod->info.name, rc); printk(KERN_ERR "ARM64 KPM Loader: Module [%s] init failed with error %ld\n",
mod->info.name, rc);
mod->exit(reserved); mod->exit(reserved);
} }
free_mod: free_mod: