Linux内核模块编程-系统调用拦截

本文详细介绍了如何在Linux内核2.6.32-431.el6.x86_64上实现系统调用拦截。通过分析系统调用的工作原理,特别是sys_call_table的作用,以及解决其不可直接访问和只读属性的问题。通过查找符号表获取sys_call_table地址,并修改内存页属性使之可写,然后在模块加载和卸载时分别替换和恢复系统调用,以达到拦截目的。文中以mkdir系统调用为例进行了具体操作演示。
摘要由CSDN通过智能技术生成

系统调用拦截

本文实验基于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 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值