在上一篇文章《系统调用分析(2)》中介绍和分析了32位和64位的快速系统调用指令——sysenter/sysexit和syscall/sysret,以及内核对快速系统调用部分的相关代码,并追踪了一个用户态下的系统调用程序运行过程。
本篇中将基于最新的Linux-5.0内核,添加一个系统调用,完成一个“系统调用日志收集系统”; 并对这三篇文章进行一个总结。
加前两篇文章在这里:
https://mp.weixin.qq.com/s/3Dvd2dy0l6OYFVGzfEvOcg
https://mp.weixin.qq.com/s/7uXVXXqzN8wMqgxqrN_5og
加一个系统调用
//
单纯添加一个系统调用会显得有些单调,出于既是作业又是学习角度,将系统调用、工作队列、修改内核、内核编译和内核模块编写插入等结合起来,通过完成一个系统调用日志收集系统。
1
系统调用日志收集系统的目的
系统调用是用户程序与系统打交道的入口,系统调用的安全直接关系到系统的安全,如果一个用户恶意地不断调用fork()将导致系统负载增加,所以如果能收集到是谁调用了一些有危险的系统调用,以及系统调用的时间和其他信息,将有助于系统管理员进行事后追踪,从而提高系统的安全性。
2
系统调用日志收集系统概述
图3-1 系统调用日志收集系统示意图
根据示意图,系统调用日志收集系统所做工作为:当用户进程执行系统调用,运行到内核函数do_syscall_64时,进行判断是否为我们需要记录的系统调用,如果是我们需要记录的系统调用则通过my_audit这一函数将记录内容写入内核中的buffer里;同时编写用户态测试程序调用335号系统调用(myaudit),这一系统调用调用my_sysaudit这一函数将内核buffer中数据copy到用户buffer中并显示日志内容;其中我们调用的my_audit和my_sysaudit都是钩子函数,具体实现使用内核模块完成并插入,方便调试。
3
系统调用日志收集系统实现
(1)增加系统调用表的表项
打开arch/x86/entry/syscalls/syscall_64.tbl,添加一个系统调用表项:
335 common myaudit __x64_sys_myaudit
(2)添加系统调用函数
在arch/x86/kernel/目录下添加myaudit.c文件完成系统调用函数: