007.实战:监控malloc调用及参数传递
上代码
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
char LICENSE[] SEC("license") = "GPL";
SEC("uprobe//lib/x86_64-linux-gnu/libc.so.6:malloc")
int uprobe_malloc(struct pt_regs *ctx)
{
size_t size = PT_REGS_PARM1(ctx);
bpf_printk("malloc(%lu)\n", size);
return 0;
}
介绍一下代码
一、include的两个头文件,是ebpf程序都需要引入的
二、如果你想使用ebpf的完整能力,就必须定义LICENSE为GPL
三、SEC是确定插桩位置。如何确定插桩的位置呢?有两个命令可用
1、nm
$ nm -D /lib/x86_64-linux-gnu/libc.so.6|grep malloc
00000000000b39a0 T __libc_malloc@@GLIBC_2.2.5
00000000000b39a0 T malloc@@GLIBC_2.2.5
00000000002171e0 V __malloc_hook@GLIBC_2.2.5
00000000000b5c30 W malloc_info@@GLIBC_2.10
0000000000217200 B __malloc_initialize_hook@GLIBC_2.2.5
00000000000b5770 W malloc_stats@@GLIBC_2.2.5
00000000000b52b0 W malloc_trim@@GLIBC_2.2.5
00000000000b5590 W malloc_usable_size@@GLIBC_2.2.5
前面带T的才是可以插桩的地方
2、readelf
$ readelf -Ws /lib/x86_64-linux-gnu/libc.so.6|grep malloc
431: 00000000002171e0 8 OBJECT WEAK DEFAULT 33 __malloc_hook@GLIBC_2.2.5
453: 00000000000b5770 623 FUNC WEAK DEFAULT 16 malloc_stats@@GLIBC_2.2.5
1665: 00000000000b5c30 86 FUNC WEAK DEFAULT 16 malloc_info@@GLIBC_2.10
1734: 0000000000217200 8 OBJECT GLOBAL DEFAULT 33 __malloc_initialize_hook@GLIBC_2.2.5
1811: 00000000000b39a0 820 FUNC GLOBAL DEFAULT 16 malloc@@GLIBC_2.2.5
2289: 00000000000b52b0 731 FUNC WEAK DEFAULT 16 malloc_trim@@GLIBC_2.2.5
2437: 00000000000b5590 51 FUNC WEAK DEFAULT 16 malloc_usable_size@@GLIBC_2.2.5
2484: 00000000000b39a0 820 FUNC GLOBAL DEFAULT 16 __libc_malloc@@GLIBC_2.2.5
FUNC、GLOBAL,即全局函数,才是可以插桩的地方
四、定义ebpf函数,名字可以随便写,参数有两种写法,这是其中一种,另外一种后面教
如何取得参数呢?三种写法
long arg1 = ctx->di;
long arg1 = ctx->regs[0];
long arg1 = PT_REGS_PARM1(ctx);
第一种写法是本质,因为参数与寄存器的关系是这样的
编译
clang -g -O2 \
-target bpf \
-D__TARGET_ARCH_x86 \
-I. \
-I/usr/include \
-I/usr/include/x86_64-linux-gnu \
-I/usr/include/bpf \
-c mem.bpf.c \
-o mem.bpf.o
会发现有很多报错
两种解决方案
一、(也是奇怪,Ubuntu25系统中没这个头文件)
#include <linux/types.h>
二、
#include "vmlinux.h"
vmlinux.h这样生成
bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h

浙公网安备 33010602011771号