从sysfs恢复或删除Linux内核模块

问题描述 投票:2回答:1

我最近编码了一个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中的所有文件(holdersparameterssectionssrcversion等)。有人可以帮我进行删除操作或将文件还原回来吗?(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;
 }

谢谢

c linux linux-kernel kernel kernel-module
1个回答
1
投票

使用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, &sect_attrs_bkp->grp))

您需要更改更多值以解决问题,但要恢复目录就足够了。

但是其他解决方案和perherp更简单的方法是,通过劫持getdents_t和getdents64_t来使您的模块目录不可见,如Diamorphine一样。

© www.soinside.com 2019 - 2024. All rights reserved.