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 |
|--------|--------|
|
|
|
## 目的与功能
本项目的目标是拦截并记录指定程序发出的系统调用。它使用 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
```
|
|
## 目的与功能
本项目的目标是拦截并记录指定程序发出的系统调用。它使用 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替代, 内核跟踪, 动态追踪, 可观测性, 子域名生成, 安全渗透, 客户端加密, 客户端加密, 性能分析, 文件描述符, 系统编程, 系统调用追踪, 预握手