Как распечатать путь к файлу из открытого системного вызова с помощью ebpf python?
Я использую bpf из модуля python bcc, и я хочу, чтобы моя функция проверки распечатывала путь к текущему файлу (своего рода настраиваемый упрощенный opensnoop). Как я могу это сделать?
Вот что у меня есть на данный момент:
b = BPF(text="""
#include <linux/ptrace.h>
#include<linux/sched.h>
BPF_HASH(last);
int trace_entry(struct pt_regs *ctx)
{
char fileName[200] = {0};
bpf_probe_read(fileName, sizeof(fileName), &PT_REGS_PARM1(ctx));
bpf_trace_printk("File Opened<%s>\\n", fileName);
return 0;
}
""")
print("Tracing for open... Ctrl-C to end")
b.attach_kprobe(event="do_sys_open", fn_name="trace_entry")
#b.attach_kprobe(event=b.get_syscall_fnname("open"), fn_name='funcky')
b.trace_print()
1 ответ
Легко:
вставьте это в код ядра:
// Nicer way to call bpf_trace_printk()
#define bpf_custom_printk(fmt, ...) \
({ \
char ____fmt[] = fmt; \
bpf_trace_printk(____fmt, sizeof(____fmt), \
##__VA_ARGS__); \
})
struct pair {
uint32_t lip; // local IP
uint32_t rip; // remote IP
};
и в код ядра вставьте распечатанный код. Этот вызов функции работает точно так же, какprintf
со всем форматом и заполнителем...
bpf_custom_printk("This year is %d\n", 2020);
Вывод на печать:
sudo cat /sys/kernel/debug/tracing/trace_pipe