我最近编码了一个LKM,它具有隐藏自身的能力。当我隐藏模块时,一切正常,但是当我还原它并在lsmod中查看它时,Used By
列的值突然变为-2
Module Size Used by
my_module 13324 -2
vboxsf 43798 1
dm_crypt 23177 0
nfsd 284396 2
auth_rpcgss 59309 1 nfsd
nfs_acl 12837 1 nfsd
nfs 240815 0
并且当我删除它时,我得到一个错误,说rmmod: ERROR: Module my_module is builtin.
,我知道它是与模块关联的kobject
的引用计数,并且只有在它是0
时才能删除该模块。我几乎可以肯定会发生这种情况,因为隐藏模块时,我删除了/sys/modules
中的所有文件(holders
,parameters
,sections
,srcversion
等)。有人可以帮我进行删除操作或将文件还原回来吗?(dmesg
中没有任何错误)
这里是代码:`
void module_hide(void) {
if(module_hidden) //is hidden
return;
module_prev = THIS_MODULE->list.prev;
kobject_prev = &THIS_MODULE->mkobj.kobj;
kobject_parent_prev = THIS_MODULE->mkobj.kobj.parent;
sect_attrs_bkp = THIS_MODULE->sect_attrs;
notes_attrs_bkp = THIS_MODULE->notes_attrs;
list_del(&THIS_MODULE->list); //remove from procfs
//kobject_del(THIS_MODULE->holders_dir);
kobject_del(&THIS_MODULE->mkobj.kobj); //remove from sysfs
THIS_MODULE->sect_attrs = NULL;
THIS_MODULE->notes_attrs = NULL;
module_hidden = (unsigned int)0x1;
}
void module_show(void) {
int result, result2;
if(!module_hidden) //is not hidden
return;
list_add(&THIS_MODULE->list, module_prev); //add to procfs
result = kobject_add(&THIS_MODULE->mkobj.kobj, kobject_parent_prev, "my_module"); //add the module to sysfs
if(result<0) {
printk(KERN_ALERT "Error to restore the old kobject\n");
}
result2 = kobject_add(THIS_MODULE->holders_dir, &THIS_MODULE->mkobj.kobj, "holders"); //add the holders dir to the module folder
if(!THIS_MODULE->holders_dir) {
printk(KERN_ALERT "Error to restore the old holders_dir\n");
}
THIS_MODULE->sect_attrs = sect_attrs_bkp;
THIS_MODULE->notes_attrs = notes_attrs_bkp;
//kobject_get(&THIS_MODULE->mkobj.kobj);
//tried using THIS_MODULE->refcnt = 0; and kobject_get(&THIS_MODULE->mkobj.kob) with no luck
module_hidden = (unsigned int)0x0;
}
谢谢
使用kobject_add仅会添加您已经知道的目录,而使用kobject_dell将删除目录和所有子目录。因此,正如您提到的,您需要添加所有需要的子目录。
要了解添加子目录的方式,请在module.c处仔细阅读sys_init_module的源代码,或阅读kobject_del->sys_remove_dir递归清除kobj->kernfs_nodes
时会删除所有属性(文件)和子目录。
因此,您需要使用函数使用其所有attrs递归创建结构
sysfs_add_file_mode_ns
sysfs_create_dir_ns
或:
__kernfs_create_file
kernfs_create_empty_dir
例如,使用以下行添加sections文件:
sysfs_create_group(&THIS_MODULE->mkobj.kobj, §_attrs_bkp->grp))
您需要更改更多值以解决问题,但要恢复目录就足够了。
但是其他解决方案和perherp更简单的方法是,通过劫持getdents_t和getdents64_t来使您的模块目录不可见,如Diamorphine一样。