BruceFan's Blog

Stay hungry, stay foolish

0%

Linux跟踪技术

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