是否可以通过直接读取内核内存来找到隐藏的内核模块?
通过隐藏我的意思是将LKM从内核模块列表中删除。
如果是这样,我应该期待什么样的结构,或者我应该读什么文件?
答案 0 :(得分:1)
在@Eugene之后,我找到了一种直接读取内核内存的方法来找到所谓的不那么聪明的隐藏模块:只需从procfs透视图和sysfs透视图中比较模块:
static int detect_hidden_mod_init(void)
{
char *procfs_modules[MAX_MODULE_SIZE];
char *sysfs_modules[MAX_MODULE_SIZE];
int proc_module_index = 0, sys_module_index = 0;
struct module *mod;
struct list_head *p;
// get modules from procfs perspective
list_for_each(p, &__this_module.list){
mod = list_entry(p, struct module, list);
procfs_modules[proc_module_index++] = mod->name;
}
// get modules from sysfs perspective
struct kobject *kobj;
struct kset *kset = __this_module.mkobj.kobj.kset;
list_for_each(p, &kset->list) {
kobj = container_of(p, struct kobject, entry);
sysfs_modules[sys_module_index++] = kobj->k_name;
}
//compare the procfs_modules and sysfs_modules
...
}
实际上它可以检测大多数当前模块隐藏的rootkit,但正如Eugene所说,“聪明的rootkit也可能试图隐藏这些数据”。所以这不是一个完美的方式。