从sysfs还原或删除Linux内核模块

时间:2017-09-30 11:46:06

标签: c linux linux-kernel kernel kernel-module

我最近编写了一个能够隐藏自身能力的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中的所有文件。holdersparameterssections,{{1}等)。有人可以帮我解决删除操作或恢复文件吗?(我不会在srcversion中收到任何错误)

这是代码: `

dmesg

由于

2 个答案:

答案 0 :(得分: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))

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

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

答案 1 :(得分:0)

我解决了

static void populate_sysfs(void)
{
    int i;
    THIS_MODULE->holders_dir=kobject_create_and_add("holders",&THIS_MODULE->mkobj.kobj);
    for (i=0;(THIS_MODULE->modinfo_attrs[i].attr.name) != NULL;i++){
      if (sysfs_create_file(&THIS_MODULE->mkobj.kobj,&THIS_MODULE->modinfo_attrs[i].attr)!=0)
        break;
    }
}