取消隐藏linux内核中的隐藏模块

取消隐藏linux内核中的隐藏模块

我编写了一个 LKM,它具有对 procfs 和 sysfs 隐藏自身的功能。问题是当我尝试取消隐藏它时出现以下错误:libkmod: ERROR ../libkmod/libkmod-module.c:1882 kmod_module_get_holders: could not open '/sys/module/my_module/holders': No such file or directory。之后我可以看到该模块显示在 中,lsmod但以 -2 作为父 PID。当我尝试删除模块时,我收到错误消息ERROR: Module my_module is builtin.。这是代码:

//HIDE
void hide(void) {
    if(module_hidden) //is hidden
            return;
    module_prev = THIS_MODULE->list.prev;
    list_del_init(&THIS_MODULE->list);                      //procfs view   

    kobject_prev = &THIS_MODULE->mkobj.kobj;
    kobject_parent_prev = THIS_MODULE->mkobj.kobj.parent;
    kobject_list_prev = THIS_MODULE->mkobj.kobj.entry.prev;

    kobject_del(&THIS_MODULE->mkobj.kobj);                  //sysfs view
    //list_del(&THIS_MODULE->mkobj.kobj.entry);
    module_hidden = (unsigned int)0x1;
}


//SHOW
void unhide(void) {
    if(!module_hidden) //is not hidden
            return;
    list_add(&THIS_MODULE->list, module_prev);              //procfs view

    //list_add(&THIS_MODULE->mkobj.kobj.entry, kobject_list_prev);
    kobject_add(kobject_prev, kobject_parent_prev, "my_module");//sysfs view
    module_hidden = (unsigned int)0x0;
}

可能是什么问题?

谢谢。

答案1

你的取消隐藏功能并没有完全恢复模块,在查看时kobject_del代码中,我们可以看到它调用了sysfs_remove_dir这会删除所有子目录和文件。

当看着kobject_add我们最终打电话kobject_add_internal->创建目录->填充目录,它只为其 ktype 默认属性创建文件,但可以在模块_k类型为 NULL,表示调用时不会恢复任何文件。

所以你需要手动恢复他所有的子目录和文件,例如refcnt,holders dir,notes dir,sect dir以及他下的所有其他属性&THIS_MODULE->modinfo_attrs(恢复它们时,不要忘记减少注释、持有者和驱动程序的模块 kobject 的引用计数)。

最好的办法是了解工作流程mod_sysfs_设置,了解应恢复内容的更多详细信息。

相关内容