前言
主要介绍内核模块API__module_address的使用以及源码解析,以及其它一些类似的模块函数。
该函数用来判断一个地址是否属于内核模块中的地址,在安全领域中该函数可以用来检测一些内核关键函数是否被hook。
通常在内核rootkit 中,比较常见的hook:hook系统调用,hook /proc 接口,hook 中断向量表等等,如果系统调用表中的地址,proc接口和中断向量表中的某个地址没有在内核地址中,而是在内核模块地址中,那么该地址就很有可能被攻击了,内核rootkit都是通过内核模块的方式来加载。因为,系统调用表中的地址,proc接口和中断向量表中都是在内核地址中。
因此我们可以用该API来进行rootkit检测,来判断一个内核关键点是否被hook。
一、__module_address源码详解
1.1 struct module
struct module是内核模块在内核中最重要的一个结构体,每一个内核模块都有一个该结构体,用来描述该内核模块的基本信息。
struct module
{
enum module\_state state;
/\* Member of list of modules \*/
struct list\_head list;
/\* Unique handle for this module \*/
char name[MODULE_NAME_LEN];
......
/\* Startup function. \*/
int (\*init)(void);
/\* If this is non-NULL, vfree after init() returns \*/
void \*module_init;
/\* Here is the actual code + data, vfree'd on unload. \*/
void \*module_core;
/\* Here are the sizes of the init and core sections \*/
unsigned int init_size, core_size;
/\* The size of the executable code in each section. \*/
unsigned int init_text_size, core_text_size;
/\* Size