Linux官方文档Linux Tracing Technologies
Ftrace可以理解为Linux上的Hook机制,基于这个机制可以实现几乎任何一个Linux内核的Hook。
Tracefs
debugfs用于用户态和内核态大量数据交换的情景,小量数据用procfs
1 2
| $ mount | grep debugfs $ mount | grep tracefs
|
1
| $ sudo ls /sys/kernel/debug/tracing
|
available_filter_functions Linux内核开启了Kprobe之后会有,记录了Linux中所有可以被Kprobe探测的函数列表。
1
| $ sudo bpftrace -l "kprobe:*" // 列举所有kprobe探测点
|
_events结尾的文件表示tracefs正在检测的函数列表
available_events在available_filter_functions基础上挑选的稳定的跟踪点,tracepoint直接从这个列表中读取
1
| $ sudo bpftrace -l "tracepoint:*"
|
/sys/kernel/debug/tracing/events/enable启用所有hook点
Ftrace手动Uprobe Hook
1 2 3 4 5 6 7
| $ readelf -s /bin/bash | grep readline | grep FUNC // 找到readline在bash中的位置 $ sudo bash -c 'echo p:readline /bin/bash:0x00000000000b84f0 %ip %ax > /sys/kernel/debug/tracing/uprobe_events' $ sudo bash -c 'echo 1 > /sys/kernel/debug/tracing/events/uprobes/readline/enable' $ sudo bash -c 'echo 1 > /sys/kernel/debug/tracing/tracing_on' $ sudo bash -c 'echo 0 > /sys/kernel/debug/tracing/events/enable' $ sudo cat /sys/kernel/debug/tracing/trace_pipe $ sudo bash -c 'echo 0 > /sys/kernel/debug/tracing/events/uprobes/readline/enable'
|
bcc一开始选用的ftrace,但是ftrace有一个弊端,有一个函数在监控时无法再添加另外的监控,会提示「Device or resource busy」,因此后面选择的是perf_events_open
。
Ftrace手动Kprobe Hook
与uprobe基本相同,可参考perf-tools
Ftrace内核Hook技术
1 2 3 4 5 6 7 8 9 10 11
| $ cd /usr/src/linux-source-5.15.0/ $ make M=samples/ftrace ... Skipping BTF generation for ***.ko due to unavailable of vmlinux $ cp /lib/modules/5.15.0-52-generic/build/vmlinux . $ make M=samples/ftrace clean $ make M=samples/ftrace // 启用tracing_on $ sudo echo 1 > /sys/kernel/tracing/tracing_on $ sudo insmod samples/ftrace/ftrace-direct.ko $ sudo cat /sys/kernel/tracing/trace_pipe
|
https://github.com/ilammy/ftrace-hook