无法使用BPF检索连接syscall参数

时间:2019-04-16 11:13:33

标签: linux linux-kernel bpf ebpf

我编写了以下BPF程序:

#include <uapi/linux/ptrace.h>
#include <uapi/linux/bpf.h>
#include <linux/version.h>

#include "include/bpf_helpers.h"

#define DEBUG
#ifdef DEBUG
/* Only use this for debug output. Notice output from bpf_trace_printk()
 * ends up in /sys/kernel/debug/tracing/trace_pipe
 */
#define bpf_debug(fmt, ...)                                                    \
    ({                                                                     \
        char ____fmt[] = fmt;                                          \
        bpf_trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__);     \
    })
#else
#define bpf_debug(fmt, ...){;}
#endif

SEC("kprobe/sys_connect")
int bpf_prog1(struct pt_regs *ctx)
{
    int sockaddr_len = (int)PT_REGS_PARM3(ctx);
    bpf_debug("sockaddr_len: %d\n", sockaddr_len);

    return 0;
}

char _license[] SEC("license") = "GPL";
__u32 _version SEC("version") = LINUX_VERSION_CODE;

这可以成功编译和加载(使用gobpf-elf),但是运行cat /sys/kernel/debug/tracing/trace_pipe可以看到...sockaddr_len: 0,即长度始终为零。在我用来测试该BPF程序的程序(即进行连接syscall的程序)上运行strace时,该长度不为0。我在做什么错了?

该程序的功能类似于Linux内核示例here,所以我很困惑为什么它不起作用。

uname -a:Linux ubuntu-bionic 4.18.0-16-generic#17〜18.04.1-Ubuntu SMP Tue Feb 12 13:35:51 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux

编辑:由于gobpf的兼容模式here,在使用SEC("kprobe/__sys_connect")之前使用__x64_sys_connect对其进行了修复-不确定为什么这样做

0 个答案:

没有答案