KnightChaser/ebpftracer

GitHub: KnightChaser/ebpftracer

一个用 C 语言和 eBPF 技术实现的轻量级系统调用追踪器,可在内核层面高效捕获并记录目标程序的系统调用行为。

Stars: 20 | Forks: 3

# ebpftracer 本项目是对 Linux 系统编程和 eBPF(扩展伯克利包过滤器)的个人探索。它并非旨在成为 `strace` 等工具的功能完备或生产级替代品(当然)。旁注:在制作这个项目时,我受到了 [SH4DY 的文章《使用 eBPF 编写系统调用追踪器》](https://sh4dy.com/2024/08/03/beetracer/) 以及 [其在 GitHub 上的公开源代码](https://github.com/0xSh4dy/bee_tracer) 的极大启发! | 截图 #1 | 截图 #2 | |--------|--------| | image | image | ## 目的与功能 本项目的目标是拦截并记录指定程序发出的系统调用。它使用 eBPF tracepoints(`raw_syscalls:sys_enter` 和 `raw_syscalls:sys_exit`)在内核层面高效地捕获事件,并将其发送到用户空间的 C 应用程序进行处理和打印。 - **核心功能**:追踪目标程序并打印其系统调用。 - **技术栈**:完全使用 C 语言构建,利用 `libbpf`、`clang` 和 Meson 构建系统。 - **状态管理**:使用线程安全的哈希表将复杂的 I/O 操作的系统调用进入/退出事件正确关联。 - **详细输出**: - 将文件描述符编号解析为绝对路径。 - 转储 `read`、`write`、`readv` 和 `writev` 等 I/O 系统调用的数据。 - 将相对路径(例如 `./file`)解析为绝对路径(例如 `/home/user/file`)。 该追踪器为 [我项目的 GitHub issue (#1)](https://github.com/KnightChaser/ebpftracer/issues/1) 中计划的系统调用提供了专用处理程序。为简化起见,其他系统调用不会被打印。 ## 构建与运行 ### 前置条件 - 支持 BTF(BSS 类型格式)的现代内核 Linux 系统。 - `clang` 和 `llvm` 工具链。 - `libbpf` 开发库。 - `bpftool`(用于生成 `vmlinux.h` 头文件)。 - `meson`(C/C++ 构建系统)。 ### 构建步骤 1. **克隆仓库(包括子模块):** git clone --recurse-submodules https://github.com/KnightChaser/ebpftracer.git cd ebpf-tracer 2. **生成 eBPF 产物:** 用户空间程序依赖于一些必须在主机上生成的内核特定头文件。 # 生成用于内核类型定义的 vmlinux.h bpftool btf dump file /sys/kernel/btf/vmlinux format c > src/vmlinux.h # 编译 eBPF C 代码并生成其用户空间骨架头文件 clang -g -O2 -target bpf -c src/controller.c -o src/controller.bpf.o bpftool gen skeleton src/controller.bpf.o > src/controller.skel.h *注意:这些生成的文件特定于您的内核版本和架构,不会纳入版本控制。* 3. **使用 Meson 配置和编译:** meson setup builddir --native-file=clang.ini cd builddir meson compile 这将在 `builddir` 中创建 `ebpftracer` 可执行文件。 ### 用法 通过将要追踪的程序作为参数传递来运行追踪器,类似于 `strace`。 ``` # 从 builddir 目录 sudo ./src/ebpftracer /bin/ls -l /tmp ```
标签:API集成, BTF, Docker镜像, IO监控, libbpf, Linux内核, Meson构建, strace替代, 内核跟踪, 动态追踪, 可观测性, 子域名生成, 安全渗透, 客户端加密, 客户端加密, 性能分析, 文件描述符, 系统编程, 系统调用追踪, 预握手