在运行的时候,BCC 会把 eBPF 程序编译成字节码、加载到内核执行,最后再通过用户空间的前端获取执行状态。 BCC 的优点就是简单易用,但也有很多缺点: 启动时编译,导致启动缓慢,且编译也需要耗费较高的 CPU 和内存资源。 编译eBPF 要求所有主机上都安装内核头文件。 编译错误只有在运行的时候才能检测到,排错困难。
bcc tools 的默认安装目录为 /usr/share/bcc/tools,/root/ebpf/bcc/examples 路径下也有一些样例,如图为 python3 hello_world.py 的输出,但是这样的 py 脚本和 bcc tools 路径下编译好的二进制文件都需要事先安装环境,无法满足渗透小工具需要上传到目标机运行的需求 二、bpf环境配置 当前vps 环境是 ubuntu 20.0...
BCC实现了对eBPF的封装,用户态部分提供Python API, 内核态部分使用的eBPF程序还是通过C语言来实现。运行时BCC会把eBPF的C程序编译成字节码、加载到内核执行,最后再通过用户空间的前端程序获取执行状态。 可以在BCC的BPF调用中,指定参数debug=4, 我们可以看到BCC的执行过程, 如: 1 2 3 4 5 6 7 from bccimport ...
} 在安装BCC工具的时候, 你可能也会注意到, 内核头文件linux-headers-$(uname-r)也是一个安装项目, 这是因为BCC在编译eBPF程序的时候, 需要从内核头文件中找到对应的内核数据结构定义, 这样你在调用bpf_probe_read时候才能从内存地址中找到正确的数据类型。
1.1BCC 工具安装 在系统中安装 BCC 工具是比较简单的,可以使用以下命令: sudo yum install bcc kernel-herders-$(uname -r); 上面如果按照不了,则安装:sudo yum install bcc-tools; BCC 工具可以让你使用 Python 和 C 语言组合来编写 eBPF 程序。
编译和加载 eBPF 程序。使用 bcc 工具将 eBPF 程序编译成机器码,然后使用用户态代码加载并运行该程序。 运行程序并处理数据。eBPF 程序在内核运行时会触发事件,并将事件相关的信息传递给用户态程序。用户态程序负责处理这些信息并将结果输出。 结束程序。当 eBPF 程序运行完成后,用户态程序可以卸载并结束运行。
之前的文章<<使用eBPF和BCC调查创建文件的进程>>介绍了基于BCC来实现eBPF程序。BCC实现了对eBPF的封装,用户态部分提供Python API, 内核态部分使用的eBPF程序还是通过C语言来实现。运行时BCC会把eBPF的C程序编译成字节码、加载到内核执行,最后再通过用户空间的前端程序获取执行状态。
第三步:运行 eBPF 程序:接下来,需要使用eBPF编译器将 eBPF 程序编译成内核可执行的格式(这个在上面的Python程序里你可以看到——Python引入了一个bcc的包,然后用这个包,把那段C语言的程序编译成字节码加载在内核中并把某个函数attach到某个事件上)。这个过程可以使用 BPF Compiler Collection(BCC)工具来完成。BCC ...
编译bcc mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j #n取决于机器的cpu核心数 编译安装完成后,在python3中就能使用bcc模块了 安装bcc时会在/usr/share/bcc目录下安装bcc自带的示例脚本和工具脚本,以及manual 文档 可以直接使用man -M /usr/share/bcc/man 来查询 ...
以前比较繁琐的任务是,将程序编译为eBPF字节码,并将其加载到内核。现在完全只需通过实例化一个新的BPF对象就可以处理。所有低层次的工作都是在幕后完成的,就Python bindings和BCC的libbpf库中。 函数BPF.trace_print()对内核的跟踪缓冲区文件执行阻塞读取,并将内容打印到标准输出中。这是输出内容: ...