gobpf 使用示例:如何找到一个系统调用对应的可用于 kprobe SEC 的内核函数

前言

前面 do_fchmodat 示例中我们是通过 chmod 命令来进行演示程序工作结果的, 那么是如何知道 chmod 命令会调用 fchmodat 系统调用并且对应的内核函数是 do_fchmodat 呢,本文记录一下查找方法,这个方法也可以用于其他程序的系统调用。

通过 strace 找到程序使用的系统调用

首先是可以通过 strace 命令找到 chmod 所使用的系统调用:

$ strace chmod +x a.txt
...
fchmodat(AT_FDCWD, "a.txt", 0775)       = 0
...

通过分析 strace 命令的输出,找到了 fchmodat 这个关键的系统调用。 下面要做的就是找出这个系统调用所使用的内核函数。

通过 /proc/kallsyms 文件查找内核函数

可以通过 /proc/kallsyms 查找 fchmodat 系统调用相关的函数 (通过 grep T 只显示全局可见的函数)

$ cat /proc/kallsyms |grep fchmodat |grep T
0000000000000000 T do_fchmodat
0000000000000000 T __x64_sys_fchmodat
0000000000000000 T __ia32_sys_fchmodat

可以看到可选的就是 do_fchmodat__x64_sys_fchmodat 这两个, 他们对应的源代码可以通过 linux 源码 仓库https://elixir.bootlin.com/ 进行查找, 经过尝试后发现实际应当使用 do_fchmodat


Comments