首页 > 解决方案 > 在实时环境中监控进程系统调用

问题描述

我已经在一个项目上工作了一段时间,第一步是为进程构建一个系统调用跟踪库。从本质上讲,我想要做的是有一个系统,其中每次进程通过系统调用请求操作系统服务时,事件的相关信息(调用进程、时间、系统调用名称)都会记录到文件中。

从理论上讲,这听起来很简单,但是随着时间的推移,实现它变得越来越痛苦。我想给我造成问题的主要原因是普遍不知道从哪里开始实施。

最初,我认为这可以通过在内核入口点添加几行代码来解决,但在研究了 entry_64.S 一段时间后,我得出结论,必须有一个更简单的方法。我的下一个想法是用我自己的服务覆盖 sys_call_table 指向的所有服务,该服务进行日志记录,然后调用原始服务。但是,事实证明,由于 sys_call_table 不再被导出,这种方法在 linux 内核 5.4.18 中存在一些困难。而且,即使在重新编译内核以导出 sys_call_table 时,该表也位于内存受保护的位置。最后,我一直在尝试使用 auditd。具体来说,我关注了这个链接但它似乎不起作用(当我执行 kill 命令时,ausearch 中只有大约 50% 的时间基于时间戳的相应结果)。

所有这些死胡同让我有点筋疲力尽,我真的希望最终能够让我的项目的第一阶段启动并运行。有人对我应该尝试什么有任何指示吗?

解决方案:BPFTrace 正是我想要的。

标签: linuxkernelmonitoringsystem-callsaudit

解决方案


每次内核开始执行系统调用时,我都使用 BPFTrace 进行记录(不包括那些由 BPFTrace 本身发起的调用)


推荐阅读