我最近编写了一个能够隐藏自身能力的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
,{{1}等)。有人可以帮我解决删除操作或恢复文件吗?(我不会在srcversion
中收到任何错误)
这是代码: `
dmesg
由于
答案 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, §_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;
}
}