将系统调用编写为内核模块

时间:2014-12-07 11:15:21

标签: linux linux-kernel kernel system-calls kernel-module

我被赋予了“将系统调用写为内核模块”的作业。现在据我在互联网上的阅读情况可以理解,实际上不可能将系统调用实现为内核模块,但是有办法拦截现有的系统调用。这是正确的方法吗? 我在这个博客上找到了一个这样的例子:http://syprog.blogspot.in/2011/10/hijack-linux-system-calls-part-i.html

1 个答案:

答案 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

基址的步骤
  1. 找到两个彼此相邻的系统调用     表(源代码)。例如:sys_read,sys_open。

  2. 获取这些sys调用的地址。

  3. 从文本部分的开头搜索这两个地址。

    (计算文本开头部分,objdump -h vmlinux | grep" .text")

  4. 找到它后,根据。计算sys_call_table的基数 他们的相对偏差。