3.18内核添加系统调用小结

---------------------------------------------------------------------------------------这里是在3.18.3内核下测试通过,虚拟机,用得是ubuntu12.04版本的


实验报告写得手抖,概括一些基础的方法,以后自己看着爽-V-(这里是未来参考用的,当然如果有同样苦逼需要来改系统调用的人说不定也能看看……学生党所以写得很基础)

根据网上查到的资料,似乎3.0以后的内核均变成了#define SYSCALL_DENFINEn(name,…)其中n代表了名字为name的系统调用接受几个输入参数,而这些宏实际上又是由基础宏——

#define SYSCALL_DEFINEx(x, sname, ...) \

__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

来对其统一进行实现的。

当然网上查到之所以内核要如此更改的理由似乎是因为Linux的系统调用在某些64平台上有漏洞,所以才在2.6.28以后版本改成了这样的形式,似乎由于用户空间程序将系统调用中32位的参数放在64位的寄存器中要做到正确的拓展,但是用户空间程序是很难保证这个行为的确定性,所以就可以通过传递特殊的数据,来导致向有漏洞的系统调用传递特别的参数(因为系统调用可以在内核空间中运行,所以级别很高,可以运行非常特殊的代码)来导致系统崩溃或者权限提升,而linux通过将系统调用的所有输入,通过上面宏定义都当成long类型(64位),然后再通过强制转换函数,转至到相应的原本定义的类型,从而更好的解决问题。(当然对这里源码具体的处理方法,其实我还是有点一知半解,看源码是一个很痛苦的过程……不断展开的宏定义感觉就像一个黑洞一样,太过于庞大而难以理解……)

添加新的系统调用,共需修改3处文件(也就是三个步骤):

(1)分配系统调用号:

在源码文件下,修改include/uapi/asm-generic/unistd.h里面数据——

1、__NR_syscalls的值+1(并不是在文档内最后,而是在中间的某个地方,这里源码似乎有更新过?看来需要什么时候研究一下)

2、仿照上面格式添加系统调用,系统调用号和之前的不要重合,虽然没有试过重合会如何……,在系统调用表里面(你是64位,or32位自己去查没有就好……系统调用表在后面会有具体的地址,这里是直接1-357都有定义,所以直接358做系统调用号了,后面莫名其妙的出现1024的系统调用感觉还蛮奇怪的?为什么会出现那么大的断层也是……奇怪

(2)修改系统调用表:

arch/x86/syscall/syscall_32.tbl(在64位内核版本则是需要更改成syscall_64.tbl)

仿照格式写就好了,没什么特别值得说明的

(3)添加处理函数:sys.c,(不是必须在这个文件中添加,可在其他文件或新建文件)

基本上可能加载在这里调用起来比较方便么?其实我也不清楚,但是亲测加在这里起码实现是可以找到到不会报错的。

写的格式依然仿照

__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

变量名直接用就好了,亲测无误~

linux用了非常安全的方法来强制转格式,怎么说呢=V=感觉非常厉害,这种安全性吾等真是看了只能跪舔……就算想到了,也懒得改好么!!!


做完这些重编译就好//make bzImage,module,module_install,install。

然后再写个测试函数(这里直接用syscall((系统调用号),(参数)…)来调用,然后测试是成功,基本就是这样)


然后成功基本就是如此~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值