繁体   English   中英

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

[英]Write a system call as a kernel module

我被分配了“将系统调用编写为内核模块”的作业。 现在,据我从互联网上的阅读所了解的,将系统调用实现为内核模块并不是完全可能的,但是有一些方法可以拦截现有的系统调用。 这是正确的方法吗? 我在此博客上找到了一个这样的示例: http : //syprog.blogspot.in/2011/10/hijack-linux-system-calls-part-i.html

在linux中,sys_call_table包含所有系统调用的函数指针。 该表最初是在2.4年代导出的,然后将其设为static,然后再次导出到一些最新的内核中,下面以两种情况为例。

情况1.导出sys_call_table。

在内核模块中使用以下行。

sys_call_table [AVAILABLE_INDEX] = new_sys_call;

新的系统调用可以实现为。

链接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. 获取这些系统调用的地址。

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

    (通过objdump -h vmlinux | grep“ .text”计算文本部分的开头)

  4. 找到它后,根据它们的相对偏移量计算sys_call_table的底数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM