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
posted @ 2026-06-02 00:15  BlackSnow  阅读(15)  评论(0)    收藏  举报