dump出Linux内核所有的slab对象缉拿内核Rootkit
前面的文章介绍了很多种隐藏进程,隐藏TCP连接,隐藏内核模块的方法,总结起来和大多数网上介绍Rootkit的文章种介绍的方法不同点在于: 网上大多数文章均是hook procfs来达到隐藏对象的目的。 我的方法则是直接将对象从链表等数据结构中摘除。 无疑,我的方法更简单,因为很显然,hook procfs需要修改大量关于VFS API调用相关的代码。 但是,跑了和尚跑不了庙,虽然进程,TCP连接,内核模块等摘了链表,它还是在slab中啊!我们只需要dump特定的slab对象,就能找到它们: dump出名字为TCP的kmem cache所有slab对象,就能找到隐藏的TCP连接。 dump出名字为task_struct的kmem cache所有slab对象,就能找到隐藏的进程。 … 然而,内核并没有提供dump所有slab对象的方法。 我们知道,/proc/slabinfo里面的信息完全不足够,这里面仅仅是伴随着slab对象的分配和释放,Linux内核记录的一些统计信息,那么,我们必须自己实现所有slab的dump操作。 来吧,让我实现它。 slab位于buddy系统的上层,从buddy系统拿page,所以我们需要从page上做文章。 让人恼火的是,作为slab的默认实现的slub kmem_cache,竟然没有字段保存自己保有了那些page! 一旦对象被分配了,它就和kmem