Linux内核——通过模块动态添加系统调用
Posted
技术标签:
【中文标题】Linux内核——通过模块动态添加系统调用【英文标题】:Linux kernel - add system call dynamically through module 【发布时间】:2011-01-24 14:20:31 【问题描述】:有没有办法动态添加系统调用,比如通过模块?我找到了可以使用模块覆盖现有系统调用的地方,只需更改sys_call_table[]
数组即可在安装模块时获取我的覆盖函数而不是本机函数,但是您可以使用新的系统调用和模块?
【问题讨论】:
我一直认为添加系统调用是个小问题,但那只是道听途说。 是的,添加系统调用对于 rootkit 来说是无用的 :) 绝对不支持添加系统调用。您可能想要一个新的解决方案来解决您的问题。为什么你觉得你需要一个新的系统调用? 【参考方案1】:不,sys_call_table
是固定大小的:
const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = ...
正如您可能已经发现的那样,您能做的最好的事情就是 intercept 现有的系统调用。
【讨论】:
谢谢。是的,我决定拦截。【参考方案2】:在某些情况下,拦截现有的系统调用(在内核中完成某些事情)不是正确的方法。例如,如果您的用户空间驱动程序需要在内核中执行某些东西,在那里发送一些东西,或者从内核中读取一些东西?
通常对于驱动来说,正确的做法是使用ioctl()调用,它只是一种系统调用,但它可以调用不同的内核函数或驱动模块——通过ioctl()传递不同的参数。
以上是用户控制的内核代码执行。
对于数据传递,您可以使用 procfs 或 sysfs 驱动程序与内核对话。
PS:当你拦截系统调用时,一般会影响到整个OS,你要考虑如何安全的解决问题:如果有人在中途调用系统调用,然后你修改/拦截怎么办代码?
【讨论】:
以上是关于Linux内核——通过模块动态添加系统调用的主要内容,如果未能解决你的问题,请参考以下文章