Linux内核之旅/张凯捷—系统调用分析(3) (基于最新Linux-5.0版本系统调用日志收集系统)

在上一篇文章《系统调用分析(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文件完成系统调用函数:

#include <linux/uaccess.h>

这里可以看到实际上定义两个钩子函数,在我们系统调用里去调用这两个钩子函数,这样可以以模块的方式添加这两个函数的具体内容,方便调试。

(3)修改Makefile

修改arch/x86/kernel/Makefile,将myaduit.c文件加入内核编译:

obj-y           += myaudit.o

(4)增加函数声明

include/linux/syscalls.h最后的endif前添加函数声明:

asmlink long sys_myaudit(u8, u8 *, u16, u8);

(5)拦截相关系统调用

正如前面对syscall执行的分析,修改do_syscall_64()函数(在/arch/x86/entry/common.c中),对系统调用号nr进行判断,如果是我们日志收集系统需要记录的系统调用,就调用我们的记录函数进行记录:

__visible void do_syscall_64(unsigned long nr, struct pt_regs *regs)

可以看到要记录的系统调用有:2:open;3:close;39:getpid;56:clone;57:fork;59:execve。

(6)重新编译内核

#提前把原来内核版本的.config拷贝到5.0内核源码根目录下

(7)添加实现钩子函数的内核模块

my_audit.c:#include <linux/init.h>

#include <linux/module.h>

(8)实现用户空间收集日志进程程序

test_syscall.c:

#include <stdlib.h>

(9)测试系统

运行用户空间收集日志进程程序,随着OS系统的运行,不断从内核里记录相关系统调用日志的buffer中取出打印在屏幕上:

//

图3-2 系统测试截图

总结

图 4-1 系统调用总结图

《系统调用分析》一共三篇文章,先从最早的系统调用方法——(int 80)开始,基于Linux-2.6.39内核开始分析,对用软中断系统调用的初始化、处理流程和系统调用表进行了学习探究。随后,基于Linux-4.20内核分析学习了从机制上对系统调用进行优化的方法——vsyscalls和vDSO。之后对32位下的快速系统调用指令——sysenter/sysexit进行指令学习和对相关Linux源码分析。然后在Linux-4.20内核下编写调用系统调用的程序,使用gdb进行调试跟踪并分析出最后使用syscall指令执行系统调用,再对64位下的快速系统调用指令syscall/sysret进行指令学习和对相关Linux源码分析。最后在Linux-5.0内核上完成一个系统调用日志收集系统,其中包含着添加系统调用,编译内核,修改内核代码,添加内核模块,编写用户态程序测试。

参考文献

[1] 英特尔®64和IA-32架构软件开发人员手册合并卷. https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf

[2] The Definitive Guide to Linux System Calls. https://blog.packagecloud.io/eng/2016/04/05/the-definitive-guide-to-linux-system-calls/#32-bit-fast-system-calls

[3] Linux 2.6 对新型 CPU 快速系统调用的支持. https://www.ibm.com/developerworks/cn/linux/kernel/l-k26ncpu/index.html

[4] vsyscalls and vDSO. https://0xax.gitbooks.io/linux-insides/content/SysCall/linux-syscall-3.html

[5] Linux系统调用过程分析. https://www.binss.me/blog/the-analysis-of-linux-system-call/

[6] Fix-Mapped Addresses and ioremap. https://0xax.gitbooks.io/linux-insides/content/MM/linux-mm-2.html

[7] 王宗涛. Linux快速系统调用实现机制分析. TP316.81

[8] linux下系统调用的实现. https://www.pagefault.info/2010/10/09/implementation-of-system-call-under-linux.html

本文分享自微信公众号 - Linux阅码场(LinuxDev)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

css position relative and absolute布局

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

4920
来自专栏二狗的DBA之路

nginx的SSL配置模板

        server_name     lnmp.org www.lnmp.org;

8440
来自专栏Jerry的SAP技术分享

git练习之二 - version revert

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

5120
来自专栏葫芦

teg nginx根据header分流

同一域名路径根据不同header头分发到不同节点,以此来做灰度发布。 主要配置 通过 http_newversion 判断版本,转发至不同upstream。

12730
来自专栏前端重点笔记

重学css3(概览)

浏览器内核又可以分成两部分:渲染引擎(layout engineer或者Rendering Engine)和JS引擎。

8020
来自专栏前端技术分享|前沿资讯|读书分享

进入移动Web世界

那么问题来了,为什么会有一个默认的viewport呢?我们知道,pc端页面,在移动端查看的时候,由于像素不匹配,但是为了能够给用户展现一个比较完整的页面,因此会...

8020
来自专栏csxiaoyao

web移动端适配方案实践

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

13330
来自专栏Jerry的SAP技术分享

view controller lifecycle discussion - beforeRendering

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

7330
来自专栏前端重点笔记

React中创建组件的3种方式

那么问题来了,这三种方式有啥区别呢?这里说明一个问题,很多时候同一种效果往往有很多种实现方式,所以我们在学习的过程中要避免章节化思维,要对技术进行...

7830
来自专栏信安之路

一文带你读懂点击劫持详解+实验

这个漏洞听起来似乎比getshell还炫酷,但如果真正理解了,其实就会发现其实还是挺简单的

16720

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励