Как распечатать путь к файлу из открытого системного вызова, используя ebpf python? - PullRequest
0 голосов
/ 02 марта 2020

Я использую bpf из модуля python b cc, и я хочу, чтобы моя функция зонда напечатала путь к файлу текущего файла (что-то вроде упрощенного пользовательского opensn oop). Как я могу это сделать?

Это то, что я имею до сих пор:

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 Ответ

0 голосов
/ 11 марта 2020

Легко:
Вставьте это в код ядра:

// 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
...