Невозможно получить аргументы syscall для соединения с BPF - PullRequest
0 голосов
/ 16 апреля 2019

Я написал следующую программу 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, то есть длина продолжает выходить как ноль. Выполнение strace в программе, которую я использую для тестирования этой программы BPF (то есть той, которая выполняет системный вызов connect), показывает, что длина не равна 0. Что я делаю неправильно?

Эта программа работает аналогично примеру с ядром Linux здесь , поэтому я совершенно запутался, почему это не работает.

uname -a: Linux ubuntu-bionic 4.18.0-16-generic # 17 ~ 18.04.1-Ubuntu SMP Вт 12 февраля 13:35:51 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux

EDIT: исправлено с помощью SEC("kprobe/__sys_connect"), до использования __x64_sys_connect из-за режима совместимости gobpf здесь - не уверен, почему это помогло

...