是否可以通过直接读取内核内存来找到隐藏的内核模块?
隐藏是指从内核模块列表中删除自身的 LKM。
如果是这样,我应该期待什么结构,或者我应该阅读什么文件?
在@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 也可以尝试隐藏这些数据”。所以这不是一个完美的方法。