我编写了一个 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_设置,了解应恢复内容的更多详细信息。