Я использую bpf из модуля python bcc, и я хочу, чтобы моя функция probe печатала путь к текущему файлу (своего рода пользовательский упрощенный 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()
bpf_probe_read()
терпит неудачу, потому что вы пытаетесь прочитать слишком много данных (200 байт, но имя файла может быть не таким длинным), и это выглядит небезопасно! В примере opensnoop от bcc есть способ получить длину имени файла и прочитать только то, что необходимо. В качестве альтернативы, я думаю, вы могли бы попытаться заменить этот вызов наbpf_probe_read_user_str()
, поэтому вам не нужно заботиться о фактической длине имени файла. - person Qeole   schedule 04.03.2020bpf_probe_read_user_str()
доступен только в последних ядрах, начиная с 5.5. В более старых ядрах теперь доступен устаревшийbpf_probe_read_str()
. См. обоснование.) - person Qeole   schedule 04.03.2020