-->if(sh->sh_flags & SHF_EXECINSTR) { if(strcmp(name,".text") ==0) obj->efile.text_shndx = idx; err = bpf_object__add_programs(obj, data, name, idx); if(err) returnerr; -->// 加载btf }elseif(strcmp(name, BTF_ELF_SEC) ==0) { if(sh->sh_type != SHT_PROGBITS) r...
跟踪(tracing)是基于事件的记录—-这也是 BPF 所使用的监测方式.例如 Linux下的 strace(1)就是一个跟踪工具, 它可以记录和打印系统调用事件的信息.有许多监测工具并不跟踪事件, 而是使用固定的计数器统计监测事件的频次, 然后打印出摘要信息:Linux top(1)便是这样的例子.跟踪工具的一个显著标志是, 它具备记录原...
这个函数的定义是: structbpf_raw_event_map*bpf_get_raw_tracepoint(constchar*name){structbpf_raw_event_map*btp=__start__bpf_raw_tp;for(;btp<__stop__bpf_raw_tp;btp++){if(!strcmp(btp->tp->name,name))returnbtp;}returnbpf_get_raw_tracepoint_module(name);} 这里的__start__bpf_raw_t...
我们一起学习内核观测性方法 BPF 提供了一种全新的跟踪技术方案, 它与其它的 Linux 跟踪技术最大的不同之处在于 1) 它是可编程的:BPF 程序被链接到内核作为内核的一部分运行;2) 它同时具备高效率和生产环境安全性的特点, 我们可以在生产环境中直接运行 BPF 程序而无须增加新的内核组件。 一、Linux 跟踪技术 ...
if (strcmp(file_to_avoid, orig_file) == 0){ putdata(child,regs.regs[1],file_to_redirect,strlen(file_to_avoid)+1); } } if (WIFEXITED(status)){ break; } } } 这里就很简单了获取到svc的信号后读取x8寄存器判断是否为openat的系统调用号,这里只对file_to_avoid进行了替换,看一下最终效果: ...
目前绝大部分app都会频繁的使用syscall去获取设备指纹和做一些反调试,使用常规方式过反调试已经非常困难了,使用内存搜索svc指令已经不能满足需求了,开始学习了一下通过ptrace/ptrace配合seccomp来解决svc反调试难定位难绕过等问题。 seccomp Linux 2.6.12中的导入了第一...
if (strcmp(".BTF.ext", sname.c_str()) == 0) { btf_ext_sec = addr; btf_ext_sec_size = size; } }if (btf_sec == nullptr || btf_ext_sec == nullptr) return;// Both .BTF and .BTF.ext ELF sections are present. // The remapped files (the main file and /virtual/include/...
if (!strcmp(btp->tp->name, name)) { if (try_module_get(btm->module)) ret = btp; goto out; } } } out: mutex_unlock(&bpf_module_mutex); return ret; } #else static struct bpf_raw_event_map *bpf_get_raw_tracepoint_module(const char *name) { ...
} else if (strcmp(shname, "version") == 0) { //如果是"version"字段 processed_sec[i] = true; if (data->d_size != sizeof(int)) { printf("invalid size of version section %zd\n", data->d_size); return 1; } memcpy(&kern_version, data->d_buf, sizeof(int));//把data-d_...
= sizeof(int)) { 558 printf("invalid size of version section %zd\n", 559 data->d_size); 560 return 1; 561 } 562 memcpy(&kern_version, data->d_buf, sizeof(int)); 563 } else if (strcmp(shname, "maps") == 0) { // 读取 maps 信息 564 int j; 565 566 maps_shndx = i...