You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内核模块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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:45:01