eBPF開發指南從原理到應用

豐生強 李泊冰

  • 出版商: 人民郵電
  • 出版日期: 2024-12-01
  • 定價: $659
  • 售價: 8.5$560
  • 語言: 簡體中文
  • 頁數: 447
  • ISBN: 7115643601
  • ISBN-13: 9787115643605
  • 下單後立即進貨 (約2週~3週)

  • eBPF開發指南從原理到應用-preview-1
  • eBPF開發指南從原理到應用-preview-2
eBPF開發指南從原理到應用-preview-1

相關主題

商品描述

本書詳細介紹了 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