在实时环境中监控进程系统调用
Posted
技术标签:
【中文标题】在实时环境中监控进程系统调用【英文标题】:Monitoring Process Syscalls in Live Environment 【发布时间】:2020-06-07 14:41:42 【问题描述】:我从事一个项目已经有一段时间了,第一步是为进程构建一个系统调用跟踪库。从本质上讲,我想要做的是有一个系统,其中每次进程通过系统调用请求操作系统服务时,事件的相关信息(调用进程、时间、系统调用名称)都会记录到文件中。
从理论上讲,这听起来很简单,但是随着时间的推移,实现它变得越来越痛苦。我想给我造成问题的主要原因是普遍不知道从哪里开始实施。
最初,我认为这可以通过在内核入口点添加几行代码来解决,但是在研究了 entry_64.S 一段时间后,我得出结论,必须有一个更简单的方法.我的下一个想法是用我自己的服务覆盖 sys_call_table 指向的所有服务,该服务进行日志记录,然后调用原始服务。但是,事实证明,由于 sys_call_table 不再被导出,这种方法在 linux 内核 5.4.18 中存在一些困难。而且,即使在重新编译内核以导出 sys_call_table 时,该表也位于内存受保护的位置。最后,我一直在尝试使用 auditd。具体来说,我关注了this link,但它似乎不起作用(当我执行 kill 命令时,ausearch 中只有大约 50% 的时间基于时间戳的相应结果)。
所有这些死胡同让我有点筋疲力尽,我真的希望最终能够启动并运行我的项目的第一阶段。有人对我应该尝试什么有任何指示吗?
解决方案:BPFTrace 正是我想要的。
【问题讨论】:
您的目标是自己编写这个工具,还是只是想要一些方法来监控系统调用?如果是后者,那么已经有工具可以做到这一点,例如ftrace
和system tap
。即使你想重新发明工具,你也可以考虑看看那些现有的工具是如何完成任务的。
谢谢,我会调查这些的。
我的目标只是收集每个进程系统调用跟踪的 dara。理想的工具将为任何运行的进程收集。我宁愿自己不编写工具。
【参考方案1】:
我使用 BPFTrace 记录每次内核开始执行系统调用(不包括那些由 BPFTrace 本身发起的调用)
【讨论】:
以上是关于在实时环境中监控进程系统调用的主要内容,如果未能解决你的问题,请参考以下文章