内核模块hook delete_module获取模块名失败问题求助
问题分析与解决
核心原因
你遇到的module_name为空但name_len大于0的问题,本质是**strncpy_from_user不会自动添加字符串终止符**。该函数返回的是成功从用户空间复制的字节数,但不会在缓冲区末尾补'\0'。当你直接用printk输出未终止的字符串时,内核会因为找不到终止符而无法正确解析内容,看起来就像空字符串。
修复代码
修改strncpy_from_user的调用逻辑,手动添加null终止符,同时预留缓冲区空间避免溢出:
asmlinkage long delete_module_func(const char __user *name_user, unsigned int flags) { long ret; char module_name[256]; int name_len; struct module *mod; // 预留一个字节给终止符,避免缓冲区溢出 name_len = strncpy_from_user(module_name, name_user, sizeof(module_name) - 1); printk(KERN_INFO "name_len %d", name_len); if (name_len <= 0 ) { printk(KERN_INFO "failed"); goto done; } // 手动添加字符串终止符 module_name[name_len] = '\0'; // 现在可以正常输出或处理module_name了 printk(KERN_INFO "Target module: %s", module_name); done: ret = orig_delete_module_func(name_user, flags); return ret; }
额外注意事项
- 5.19内核中
delete_module的参数逻辑未发生根本性变化,name_user依然是用户空间传入的模块名字符串,无需担心参数类型问题。 - 如果你需要匹配隐藏的自研模块,建议直接通过模块结构体的
name字段对比,而非依赖用户空间传入的名称(避免被伪造)。可以通过遍历内核模块链表或使用find_module函数(需注意内核版本兼容性)获取模块结构体。
内容的提问来源于stack exchange,提问作者Falafel_Truck
相关产品推荐
相关产品推荐

