eBPF開發指南從原理到應用
豐生強 李泊冰
相關主題
商品描述
本書詳細介紹了 eBPF 核心技術及其應用。全書可分為 eBPF 基礎知識、進階應用和實際案例三大部分,覆蓋了 eBPF 的編程接口、架構及其在性能分析、安全監控和網絡協議等方面的應用。讀者將通過 C、Go 和Python 等語言學習 eBPF 編程,並掌握其在系統監控、數據分析和性能提升方面的實際技巧。
本書適合不同層次的讀者,包括對操作系統或應用程序監控感興趣的學生和初學者、希望利用 eBPF 進行內核代碼調試和優化的 Linux 內核開發人員、使用 eBPF 監控系統事件和分析惡意軟件的安全工程師和逆向工程師、通過 eBPF 收集性能數據以優化軟件和系統性能的性能分析師和應用程序開發者,以及希望優化虛擬化軟件性能和管理的虛擬化開發人員。
作者簡介
丰生强 独立软件安全研究员, 资深软件安全专家,ISC2016 安全训练营独立讲师,拥有丰富的软件安全实战经验。自2008年起,在安全杂志《黑客防线》上发表技术文章, 活跃于国内各大软件安全论坛,具有深厚的行业影响力。著有《Android 软件安全与逆向分析》《macOS 软件安全与逆向分析》等热销图书,深受读者喜爱。
李泊冰 安全专家,资深程序员,专注于移动安全研究。拥有近 10 年的行业经验,擅长软件安全攻防对抗,多次从零开始构建企业移动安全体系,具备丰富的实战经验。曾在国内多家互联网公司任职,涉及电商、短视频、游戏、杀毒软件等多个领域。业余时间致力于软件与系统底层技术的研究。
目錄大綱
第 1 章 eBPF 概述 1
1.1 eBPF 是什麽 1
1.2 eBPF 發展歷史 2
1.3 eBPF 應用領域 4
1.4 eBPF 如何運行 5
1.5 eBPF 相關工具與庫 6
1.5.1 BCC 6
1.5.2 bpftrace 7
1.5.3 libbpf 8
1.6 初識 eBPF 程序 8
1.7 本章小結 9
第 2 章 eBPF 開發環境準備 10
2.1 Linux 發行版本的選擇 10
2.2 編程語言的選擇 12
2.3 安裝和配置 Linux 操作系統
環境 13
2.3.1 Windows 上安裝和配置
Linux 14
2.3.2 macOS 上安裝和配置
Linux 16
2.3.3 其他環境安裝 17
2.4 以二進制方式安裝 eBPF 開發
工具與庫 20
2.4.1 安裝 BCC 20
2.4.2 安裝 bpftrace 21
2.4.3 安裝 libbpf 21
2.5 以源碼方式安裝 eBPF 開發
工具與庫 22
2.5.1 編譯安裝 BCC 22
2.5.2 編譯安裝 bpftrace 23
2.5.3 編譯安裝 libbpf 24
2.6 本章小結 24
第 3 章 Linux 動態追蹤技術 25
3.1 Linux 動態追蹤系統 25
3.2 前端工具和庫 26
3.2.1 strace 與 ltrace 26
3.2.2 DTrace 29
3.2.3 SystemTap 30
3.2.4 LTTng 30
3.2.5 trace-cmd 31
3.2.6 perf 31
3.3 數據採集機制 35
3.3.1 ptrace 系統調用 36
3.3.2 perf_event_open 系統
調用 36
3.3.3 BPF 系統調用 37
3.3.4 其他子系統與內核
模塊 37
3.4 跟蹤文件系統 37
3.4.1 掛載位置 38
3.4.2 目錄詳情 38
3.4.3 跟蹤器 43
3.4.4 跟蹤選項 44
3.4.5 環形緩沖區 47
3.5 Linux 內核數據源 48
3.5.1 ftrace 49
3.5.2 kprobe/kretprobe 70
目錄
- 2 -
3.5.3 uprobe/uretprobe 74
3.5.4 tracepoint 77
3.6 eBPF 數據採集點 83
3.7 本章小結 84
第 4 章 eBPF 程序入門 85
4.1 第 一個 eBPF 程序 85
4.1.1 第 一個 BCC 程序 85
4.1.2 第 一個 C 語言版本的
eBPF 程序 86
4.2 eBPF 程序功能解讀 91
4.2.1 加載 eBPF 字節碼 92
4.2.2 BPF 系統調用 93
4.2.3 attach_kprobe 96
4.2.4 perf_event_open 系統
調用 96
4.3 eBPF 授權協議 102
4.4 eBPF 指令集 103
4.4.1 eBPF 寄存器 103
4.4.2 eBPF 指令編碼 104
4.4.3 指令列表 105
4.4.4 eBPF 指令分析 109
4.4.5 BCC 中 eBPF 程序指令的
生成 110
4.4.6 eBPF 指令反匯編 112
4.4.7 eBPF 驗證機制 117
4.5 libbpf 126
4.5.1 libbpf 功能 126
4.5.2 libbpf 接口 127
4.6 libbpf 案例程序 128
4.7 重寫 eBPF 程序 131
4.7.1 如何編譯 132
4.7.2 編譯內核態程序 135
4.7.3 編譯生成 skel 頭文件 136
4.7.4 編譯用戶態程序 141
4.8 本章小結 143
第 5 章 BCC 144
5.1 BCC 工具集 145
5.1.1 tools 工具集 146
5.1.2 libbpf-tools 工具集 146
5.2 BCC 常用的工具 147
5.2.1 opensnoop 147
5.2.2 exitsnoop 149
5.2.3 execsnoop 150
5.3 使用 Python 開發 eBPF 程序 152
5.3.1 BPF API 152
5.3.2 opensnoop 程序解讀 157
5.4 使用 libbcc 開發 eBPF 程序 165
5.4.1 libbcc 的編譯與安裝 166
5.4.2 重寫 eBPF 程序 167
5.4.3 編譯與測試 175
5.5 本章小結 181
第 6 章 bpftrace 182
6.1 bpftrace 的功能和特性 182
6.1.1 工程結構 182
6.1.2 探針類型 184
6.1.3 特性 185
6.1.4 主程序 185
6.2 bpftrace 的腳本語法 191
6.3 探針類型 198
6.3.1 kprobe 和 kretprobe 198
6.3.2 uprobe 和 uretprobe 200
6.3.3 跟蹤點 202
6.3.4 USDT 204
6.3.5 定時器事件 208
6.3.6 軟件與硬件事件 209
6.3.7 內存監視點 211
6.3.8 kfunc 和 kretfunc 214
6.3.9 迭代器 215
6.3.10 開始塊與結束塊 217
目錄
- 3 -
6.4 bpftrace 變量 217
6.4.1 內置變量 217
6.4.2 基礎變量 218
6.4.3 關聯數組 221
6.5 bpftrace 函數 221
6.5.1 基礎函數 221
6.5.2 映射表相關函數 225
6.6 bpftrace 的工作原理 226
6.7 bpftrace 工具集 231
6.8 本章小結 236
第 7 章 使用 Golang 開發 eBPF 程序 238
7.1 Go 語言開發環境介紹 238
7.2 使用 libbpfgo 開發 eBPF
程序 239
7.2.1 搭建 libbpfgo 開發
環境 239
7.2.2 開發 eBPF 程序 241
7.3 Cilium 與 ebpf-go 244
7.3.1 搭建 ebpf-go 開發
環境 244
7.3.2 使用 ebpf-go 開發 eBPF
程序 245
7.3.3 bpf2go 和 bpftool 249
7.4 本章小結 255
第 8 章 BTF 與 CO-RE 256
8.1 什麽是 CO-RE 257
8.2 BTF 詳解 258
8.2.1 BTF 數據結構 258
8.2.2 BTF 內核 API 261
8.2.3 生成 BTF 信息 262
8.2.4 二進制中的 BTF 264
8.2.5 BTF 相關輔助函數 265
8.3 對 BTF 的處理 266
8.3.1 編譯器對 BTF 的處理 266
8.3.2 libbpf 對 BTF 的處理 268
8.4 讀取內核結構體字段 269
8.4.1 案例一:直接訪問
結構體 269
8.4.2 案例二:使用 bpf_get_
current_task_btf 270
8.4.3 案例三:使用 BPF_
CORE_READ 271
8.4.4 BTF 相關的其他宏 273
8.5 低版本系統如何支持 BTF 274
8.5.1 什麽是 BTFHub 275
8.5.2 生成最小化的 BTF
信息 279
8.5.3 編譯運行 BTF-App 280
8.6 本章小結 285
第 9 章 eBPF 程序的數據交換 286
9.1 eBPF 程序的數據結構 286
9.1.1 什麽是 eBPF map 286
9.1.2 map 支持的數據類型 291
9.2 map 操作接口 294
9.2.1 eBPF map 相關的 API 294
9.2.2 創建 map 299
9.2.3 添加數據 300
9.2.4 查詢 301
9.2.5 遍歷數據 301
9.2.6 刪除數據 302
9.2.7 使用 bpftool 操作 map 302
9.3 map 在內核中的實現 306
9.3.1 創建 map 對象 307
9.3.2 map 對象的生命周期 314
9.3.3 eBPF 對象持久化 315
9.4 ftrace 的 eBPF 數據交換接口 317
9.4.1 bpf_trace_printk 317
9.4.2 封裝的 bpf_printk 宏 320
9.4.3 trace 日誌的輸出格式 321
目錄
- 4 -
9.5 perf 事件 322
9.5.1 perf 事件的 map 類型 323
9.5.2 內核態程序寫入 perf
事件 324
9.5.3 用戶態程序讀取 perf
事件 327
9.5.4 BCC 中 perf 事件處理 330
9.6 環形緩沖區 333
9.6.1 eBPF ringbuf 的 map
類型 334
9.6.2 內核態程序如何使用
ringbuf 335
9.6.3 用戶態程序如何使用
ringbuf 344
9.6.4 完整的數據交換實例 346
9.7 本章小結 351
第 10 章 eBPF 程序類型與掛載點 353
10.1 常見的 eBPF 程序類型 353
10.1.1 跟蹤和分析類 355
10.1.2 網絡類 356
10.2 eBPF 程序掛載點 357
10.3 函數跟蹤技術 358
10.3.1 內核態程序跟蹤 358
10.3.2 用戶態程序跟蹤 360
10.4 kprobe 361
10.4.1 內核中使用 kprobe
探針 361
10.4.2 kretprobe 365
10.4.3 eBPF 中創建 kprobe
跟蹤 368
10.5 uprobe 372
10.5.1 創建單行程序測試
uprobe 372
10.5.2 eBPF 中創建 uprobe
跟蹤 373
10.5.3 bashreadline 程序 377
10.6 USDT 379
10.6.1 在 BCC 中使用
USDT 379
10.6.2 在 libbpf 中使用
USDT 384
10.7 本章小結 387
第 11 章 eBPF 內核輔助方法 388
11.1 如何查閱內核輔助方法 388
11.2 輔助方法的實現原理 389
11.3 eBPF 內核輔助方法分類 392
11.3.1 網絡相關的輔助
方法 392
11.3.2 數據處理類輔助
方法 396
11.3.3 跟蹤相關的輔助
方法 398
11.3.4 系統功能性輔助
方法 399
11.4 常用的 eBPF 內核輔助方法 401
11.5 本章小結 404
第 12 章 Linux 性能分析 405
12.1 CPU 406
12.1.1 CPU 基礎知識 406
12.1.2 傳統 CPU 分析工具 409
12.1.3 eBPF 相關分析工具 412
12.1.4 CPU 分析策略 413
12.2 內存 414
12.2.1 內存基礎知識 414
12.2.2 傳統內存分析工具 419
12.2.3 eBPF 內存分析工具 419
12.2.4 內存分析方法 420
12.3 磁盤 I/O 420
12.3.1 磁盤 I/O 基礎知識 420
目錄
- 5 -
12.3.2 傳統分析工具 423
12.3.3 BCC 中的分析工具 423
12.3.4 磁盤性能分析方法 423
12.4 網絡 424
12.4.1 網絡基礎知識 424
12.4.2 傳統網絡分析工具 426
12.4.3 eBPF 網絡分析
工具 426
12.5 常用分析方法和案例 427
12.6 本章小結 428
第 13 章 eBPF 實戰應用 429
13.1 在網絡安全中的應用 429
13.2 在軟件動態分析中的應用 432
13.3 在安全環境增強中的應用 439
13.4 在網絡數據處理中的應用 443
13.5 在系統與雲原生安全中的
應用 446
13.6 本章小結 448