[原创] 60秒学会用eBPF-BCC hook系统调用
1天前 1400
(备注1: 为了格式工整, 前面都是废话, 建议直接从11 hello world开始看)
(备注2: 60秒指的是在Linux上, 如果是Android可能要在基础再上加点)
整理自2022/10 (bcc Release v0.25.0)
(1) BPF是什么?
(2) eBPF是什么?
(3) BCC是什么?
(4) IO Visor是什么?
(5) BCC在内核调试技术栈中的位置?
(6) 不同Linux内核版本对eBPF的支持?
(7) 官方文档
(8) 其他参考
(9) 安装BCC二进制包 (Ubuntu) (测试发现没法用)
(10) 自行编译安装 (Ubuntu) (推荐)
(11) hello world!
(12) 如何用监控open()函数的执行?
(13) 如何hook 任意system call?
.
.
Linux内核中运行的虚拟机,
可以在外部向其注入代码执行.
.
.
理解成BFP PLUS++
.
.
BPF虚拟机只运行BPF指令, 直接敲BPF指令比较恶心.
BCC可以理解成辅助写BPF指令的工具包,
用python和c语言间接生成EBPF指令.
.
.
指的是开源项目&&开发者社区,
BCC是IOVisor项目下的编译器工具集.
.
.
.
.
参考官方文档
https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md
.
查看自己Linux 内核版本 (ubuntu)
.
.
Brendan Gregg出品教程
https://www.brendangregg.com/ebpf.html
.
linux内核调试追踪技术20讲
https://space.bilibili.com/646178510/channel/collectiondetail?sid=468091
.
使用ebpf跟踪rpcx微服务
https://colobu.com/2022/05/22/use-ebpf-to-trace-rpcx-microservices/
.
一 启航
https://developer.aliyun.com/article/590484?spm=a2c6h.13262185.profile.109.74541f13UmhQiC
.
二 性能问题定位
https://developer.aliyun.com/article/590865?spm=a2c6h.13262185.profile.108.74541f13UmhQiC
.
三 自定义工具trace
https://developer.aliyun.com/article/590867?spm=a2c6h.13262185.profile.107.74541f13UmhQiC
.
四 工具argdist
https://developer.aliyun.com/article/590869?spm=a2c6h.13262185.profile.106.74541f13UmhQiC
.
五 工具funccount
https://developer.aliyun.com/article/590870?spm=a2c6h.13262185.profile.105.74541f13UmhQiC
.
六 工具查询列表
https://developer.aliyun.com/article/591411?spm=a2c6h.13262185.profile.104.74541f13UmhQiC
.
七 开发脚本
https://developer.aliyun.com/article/591412?spm=a2c6h.13262185.profile.103.74541f13UmhQiC
.
八 BPF C
https://developer.aliyun.com/article/591413?spm=a2c6h.13262185.profile.102.74541f13UmhQiC
.
九 bcc Python
https://developer.aliyun.com/article/591415?spm=a2c6h.13262185.profile.101.74541f13UmhQiC
.
.
具体参考官方文档
https://github.com/iovisor/bcc/blob/master/INSTALL.md
.
iovisor版 (官网说这个比较旧)
1 2 3 4 |
|
.
Nightly版
1 2 3 |
|
.
安装后目录结构
bcc路径为/usr/share/bcc
.
.
确定版本自己ubuntu版本代码
1 2 3 4 5 6 |
|
.
官网找对应ubuntu版本的依赖
1 2 3 |
|
.
下载编译
1 2 3 4 5 6 7 8 9 10 |
|
.
.
运行hello_world.py
进入bcc/examples目录,
运行脚本sudo python3 hello_world.py,
它的逻辑是, hook了某个syscall, 每当运行该syscall, 就输出helloworld.
你随便点点鼠标, 就能触发它显示日志了.
.
运行hello_fields.py
这个脚本是一样的逻辑, 不过输出格式对齐了,
.
.
进入bcc/tools/目录,运行opensoop.py脚本.
然后自己开clion编一个demo,
调用open触发eBFP的callback.
.
.
opensoop.py的实现
ok, 上面这样eBPF就算跑起来了,
然后我不想学那些罗里吧嗦的东西,
就直奔主题, 你就说上面那个脚本是怎么hook的open?
.
我打开那个脚本看了一下, blabla一大堆, 基本都在处理兼容和格式,
看的烦, 我把不关心的东西都删了, 留下核心的代码, 写好注释放这里了.
.
.
如何任意的hook syscall?
只关心4点:
(1)怎么写before?
(2)怎么写after?
(3)怎么注册hook?
(4)怎么输出日志?
(跟xposed差不多的叙事结构)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
|
看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)
最后于 4小时前 被爱吃菠菜编辑 ,原因: