系统调用拦截
本文实验基于Centos6.5 内核版本2.6.32-431.el6.x86_64,系统调用拦截的目的其实就是把系统真正要执行的系统调用替换为我们自己写的内核函数。
系统调用拦截的实现
那么如何去实现系统调用拦截呢,通过学习系统调用的内核实现我们发现其实系统调用的地址是放在sys_call_table中通过系统调用号定位到具体的系统调用地址,然后开始调用,那么通过编写内核模块来修改sys_call_table中指定系统调用的地址,其实就可以实现系统调用拦截的功能,这种方案在早期是很容易做到的,但是现在的内核做了一定的变动将sys_call_table没有导出,也就是说无法在内核模块中直接使用sys_call_table,还有一点就是sys_call_table所在内存页是只读的,无法进行修改。因此要想实现系统调用拦截需要解决上面的两个问题。对于第一个问题,sys_call_table地址的问题,可以通过内核生成的符号表找到其地址,然后进行更改。对于第二个问题,修改内存页的属性,让其变为可写。
代码分析
要添加的头文件,这里添加的头文件可能有些没有用到,但是却引入了,有兴趣的读者可以进行修改。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
//编写内核模块所需要的一些头文件,比如模块注册和注销的宏等
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/file.h>
#include <linux/fs_struct.h>
#include <linux/fdtable.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/syscalls.h>
#include <linux/list.h>
#include <linux/jiffies.h>
#include <linux/cdev.h>
#include <asm/unistd.h>
#include <