我将详细描述我的问题,并请原谅我的不守规矩和粗鲁。
我在 seccomp-BPF 和信号处理方面做了一些实验。一开始我遵循了这个教程。
添加 SIGSYS 信号处理(syscall-reporter.c)后,如果程序执行一些无效的系统调用,我可以在下面得到一些输出:
Looks like you need syscall fstat(5) too!
execve
我想知道如果我使用函数或其他方法执行任何其他可执行文件,如何打印系统调用名称。
我尝试过这样的事情:主进程(刚刚命名为 P0 的进程)首先添加 SIGCHLD 信号处理,然后分叉一个子进程(名为 P1)。P1 将添加 seccomp-bpf 规则并对无效的系统调用执行 seccomp 操作SCMP_ACT_TRAP
,然后使用该execve
函数将 P1 替换为可执行文件(名为 E)。当执行 E 并调用一些无效的系统调用时,P1 将抛出一个 SIGSYS 信号并退出,然后向 P0 发送 SIGHLD 信号。似乎 P0 无法从ucontext_t
收到的 SIGHLD 信号中获取无效的系统调用名称。
P1 不能打印系统调用名称本身,因为
在 execve(2) 期间,已处理信号的处置被重置为默认值;
(来自sigaction 手册页)
对不起我的英语不好。