我被赋予了“将系统调用写为内核模块”的作业。现在据我在互联网上的阅读情况可以理解,实际上不可能将系统调用实现为内核模块,但是有办法拦截现有的系统调用。这是正确的方法吗? 我在这个博客上找到了一个这样的例子:http://syprog.blogspot.in/2011/10/hijack-linux-system-calls-part-i.html
答案 0 :(得分:2)
在linux中,sys_call_table包含所有系统调用的函数指针。这个表最初是在2.4的时候导出的,然后它被静态化了,然后又被导出了一些最新的内核。让我们举两个案例。
案例1. sys_call_table已导出。
在内核模块中使用以下行。
sys_call_table [AVAILABLE_INDEX] = new_sys_call;
新系统调用可以实现为。
asmlinkage new_sys_call(...){}
案例 - 2)sys_call_table未导出。
尝试通过在System.map
中进行grepping来获取sys_call_table地址$ cat System.map | grep sys_call_table
对模块中的值进行硬编码。
如果没有,那么我们需要动态确定表地址。 sys_call_table很可能出现在内核文本部分的开头。
以下是计算sys_call_table
基址的步骤找到两个彼此相邻的系统调用 表(源代码)。例如:sys_read,sys_open。
获取这些sys调用的地址。
从文本部分的开头搜索这两个地址。
(计算文本开头部分,objdump -h vmlinux | grep" .text")
找到它后,根据。计算sys_call_table的基数 他们的相对偏差。