我已经在一个项目上工作了一段时间,第一步是为进程构建一个syscall跟踪库。本质上,我试图做的是让系统在每次进程通过syscall请求操作系统服务时,将事件的相关信息(调用进程、时间、syscall名称)记录到一个文件中。
理论上,这听起来是一件很简单的事情,然而,随着时间的推移,实现这样的事情正变得越来越痛苦。我认为给我带来问题的主要原因是我普遍不知道从哪里开始实现。
最初,我认为可以通过向内核入口点添加几行代码来处理这些问题,但在深入研究entry_64.S一段时间后,我得出的结论是肯定有更简单的方法。我的下一个想法是用我自己的服务覆盖sys_call_table指向的所有服务,这些服务记录日志,然后调用原始服务。但是,事实证明,由于sys_call_table不再被导出,这种方法在linux内核5.4.18中存在一些困难。而且,即使在重新编译内核以便导出sys_call_table时,该表也处于内存保护位置。最后,我一直在尝试auditd。具体地说,我遵循了this link,但它似乎不起作用(当我执行kill命令时,根据时间戳,大约50%的时间只有一个对应的结果)。
我对所有这些死胡同感到有点疲惫,我真的很希望最终能在我的项目中完成第一阶段的工作。有没有人对我应该尝试的东西有什么建议?
解决方案: BPFTrace正是我要找的。
发布于 2020-03-13 12:17:44
我使用BPFTrace记录内核每次开始执行系统调用的时间(不包括由BPFTrace本身启动的那些)。
https://stackoverflow.com/questions/60367940
复制相似问题