bpftrace -l和kprobes使用

使用kprobe测试时,会发现有些接口无法使用。

比如do_execveat_common这个接口,在另一个版本接近的内核源码中可以看到,但实际注册提示找不到这个接口。

有可能是因为内核源码不完全一致,也可能是因为有的接口在编译时被优化掉了?

1、bpftrace -l

所以bpftrace -l这个查询接口就十分重要。

#bpftrace -l 'kprobe:*exec*'

会列出很多exec相关的支持kprobe功能的接口,最终配合源码,选择跟踪bprm_execve这个接口。

2、bpftrace使用kprobe跟踪

#!/usr/bin/env bpftrace

#include <linux/fs.h>

//kprobe:do_execveat_common
kprobe:bprm_execve
{
    printf("filename:%s\n", str(((struct filename *)arg2)->name));

}

结果就是可以跟踪系统通过exec启动的二进制程序。

执行效果如下:

/home/leiyanjie/test/bpftrace # bpftrace exec.bt
Attaching 1 probe...
filename:/bin/sh
filename:/bin/tr
filename:/bin/cat
filename:/bin/sh
filename:/bin/tr
filename:/bin/cat
filename:/taihang/bin/regcmd
filename:/taihang/bin/regcmd

3、bpftrace增加过滤条件

如果想只看某个特殊的二进制程序呢?那就可以比对filename和期望的二进制程序路径就可以了。

#!/usr/bin/env bpftrace

#include <linux/fs.h>

//kprobe:do_execveat_common
kprobe:bprm_execve
{
    if(str(((struct filename *)arg2)->name) == "/taihang/bin/regcmd") {
        printf("filename:%s\n", str(((struct filename *)arg2)->name));
    }
}

执行效果如下:

/home/leiyanjie/test/bpftrace # bpftrace exec.bt
Attaching 1 probe...
filename:/taihang/bin/regcmd
filename:/taihang/bin/regcmd
filename:/taihang/bin/regcmd
filename:/taihang/bin/regcmd
filename:/taihang/bin/regcmd
filename:/taihang/bin/regcmd

4、count()

count()的值需要记录到一个map,一般是分类计数的时候使用。

比如我们统计每个进程执行过多少次bprm_execve接口。

test/bpftrace # bpftrace -e "k:bprm_execve { @count[comm] = count(); }"
Attaching 1 probe...
^C

@count[crond]: 1
@count[libvirtd]: 1
@count[kworker/u32:1]: 1
@count[python3]: 2
@count[python]: 2
@count[taihang_sdpcie_]: 3
@count[ioemu_cli]: 4
@count[bash]: 4
@count[ipmitool]: 6
@count[sh]: 11
@count[node_exporter]: 18

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过Kprobes模拟Linux的内核态内存故障,可以采取以下步骤: 1. 前置步骤 在开始模拟之前,需要确保系统中已经安装了Kprobes工具,并且已经启用了内核调试选项。可以使用以下命令来检查系统中是否安装了Kprobes工具: ``` which kprobe ``` 如果输出了路径信息,则表示系统中已经安装了Kprobes工具。 2. 指令和过程 接下来,可以使用以下指令和过程来模拟内核态内存故障: (1)编写测试代码 首先,需要编写一个测试代码,该代码会故意访问非法的内存地址,触发内核态内存故障。例如,可以在代码中使用以下指令: ``` char *ptr = NULL; *ptr = 'a'; ``` 这段代码会将空指针ptr所指向的内存地址写入字符'a',由于ptr为NULL,因此会导致内存访问非法。 (2)为测试代码添加Kprobe 接下来,可以使用Kprobes工具为测试代码添加Kprobe。Kprobe是一种在内核函数执行前或执行后插入代码的机制,可以用来跟踪和分析内核代码的执行过程。可以使用以下指令为测试代码添加Kprobe: ``` echo 'p:myprobe do_fault_error_handler' > /sys/kernel/debug/tracing/kprobe_events ``` 这段指令会在内核态故障处理函数do_fault_error_handler执行前插入一段代码,用于捕获内存故障。 (3)运行测试代码 最后,可以运行测试代码,触发内核态内存故障。可以使用以下指令来编译和运行测试代码: ``` gcc -o test test.c ./test ``` 运行测试代码后,Kprobes会捕获内核态内存故障,并且可以在/var/log/messages中查看相关日志信息。 需要注意的是,在使用Kprobes进行内核态内存故障模拟时,一定要注意对系统的影响,并且遵守安全操作规范,避免数据丢失或者系统崩溃等问题。同时,也要保证故障不会对生产环境造成影响。操作时应当十分小心谨慎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值