[英]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基址的步骤
在表中找到两个彼此相邻的系统调用(来自源代码)。 例如:sys_read,sys_open。
获取这些系统调用的地址。
从文本部分的开头搜索这两个地址。
(通过objdump -h vmlinux | grep“ .text”计算文本部分的开头)
找到它后,根据它们的相对偏移量计算sys_call_table的底数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.