eBPF 获取内核结构体属性

由于eBPF 内核中内存读取的限制,默认情况是不能直接访问内核指针属性的。

需要使用bpf_core_read , bpf_core_read_str等读取出来才能继续操作

比如下面检查特定进程的例子

#define TASK_COMM_LEN 16
const volatile char target_comm[TASK_COMM_LEN ];
const volatile bool target_sub_process  = true;

///
/// \brief process_check
/// \return 1 not match process with target_comm
///         0 match this process
///
static __always_inline int process_check(){

    char bpf_comm[TASK_COMM_LEN] = {0};
    long len = bpf_get_current_comm(bpf_comm,TASK_COMM_LEN);



    if (bpf_strncmp(bpf_comm,TASK_COMM_LEN,target_comm))
        return 1;
    else

    if( target_sub_process )
    {
        struct task_struct* task = (struct task_struct *)bpf_get_current_task();
        struct task_struct* task_parent;
        //task_parent = task->parent //这句eBPF 验证器容易产生invaild read之类错误
        bpf_core_read(&task_parent, sizeof(void*), &task->parent);//替换成这样即可消除
        int err = bpf_core_read(&bpf_comm, TASK_COMM_LEN, &task_parent->comm);

        bpf_printk("#### task_parent_comm = %s \n " , bpf_comm);
        if (bpf_strncmp(bpf_comm,TASK_COMM_LEN,target_comm)) //比较
            return 1;

    }

    return 0;
}