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;
}