在实时环境中监控进程系统调用
Monitoring Process Syscalls in Live Environment
我已经在一个项目上工作了一段时间,第一步是为进程构建一个系统调用跟踪库。本质上,我想要做的是拥有一个系统,其中每次进程通过系统调用请求 OS 服务时,事件的相关信息(调用进程、时间、系统调用名称)都会记录到一个文件中。
从理论上讲,这听起来很简单,但是随着时间的推移,实现起来会越来越痛苦。我想对我造成问题的主要原因是普遍不知道从哪里开始实施。
最初,我认为这一切都可以通过在内核入口点添加几行代码来解决,但是在 entry_64.S 挖掘了一会儿之后,我得出的结论是必须有是一种更简单的方法。我的下一个想法是用我自己的服务覆盖 sys_call_table 指向的所有服务,该服务进行日志记录然后调用原始服务。但是,事实证明,由于 sys_call_table 不再导出,此方法对于 linux 内核 5.4.18 存在一些困难。而且,即使在重新编译内核以便导出 sys_call_table 时,table 也位于内存保护位置。最后,我一直在试验 auditd。具体来说,我遵循了 this link 但它似乎不起作用(当我执行 kill 命令时,根据时间戳,大约 50% 的时间在 ausearch 中只有相应的结果)。
所有这些死胡同让我有点筋疲力尽,我真的希望最终能在我的项目中完成这个第一阶段 运行。有人对我应该尝试什么有任何指示吗?
解决方案:BPFTrace 正是我要找的。
每次内核开始执行系统调用(不包括由 BPFTrace 本身启动的)时,我都使用 BPFTrace 进行记录
我已经在一个项目上工作了一段时间,第一步是为进程构建一个系统调用跟踪库。本质上,我想要做的是拥有一个系统,其中每次进程通过系统调用请求 OS 服务时,事件的相关信息(调用进程、时间、系统调用名称)都会记录到一个文件中。
从理论上讲,这听起来很简单,但是随着时间的推移,实现起来会越来越痛苦。我想对我造成问题的主要原因是普遍不知道从哪里开始实施。
最初,我认为这一切都可以通过在内核入口点添加几行代码来解决,但是在 entry_64.S 挖掘了一会儿之后,我得出的结论是必须有是一种更简单的方法。我的下一个想法是用我自己的服务覆盖 sys_call_table 指向的所有服务,该服务进行日志记录然后调用原始服务。但是,事实证明,由于 sys_call_table 不再导出,此方法对于 linux 内核 5.4.18 存在一些困难。而且,即使在重新编译内核以便导出 sys_call_table 时,table 也位于内存保护位置。最后,我一直在试验 auditd。具体来说,我遵循了 this link 但它似乎不起作用(当我执行 kill 命令时,根据时间戳,大约 50% 的时间在 ausearch 中只有相应的结果)。
所有这些死胡同让我有点筋疲力尽,我真的希望最终能在我的项目中完成这个第一阶段 运行。有人对我应该尝试什么有任何指示吗?
解决方案:BPFTrace 正是我要找的。
每次内核开始执行系统调用(不包括由 BPFTrace 本身启动的)时,我都使用 BPFTrace 进行记录