我们可以使用 kprobes 跟踪所有 Linux 内核函数吗

问题描述 投票:0回答:1

我阅读了以下有关 kprobes 的内容:

Kprobes 允许您为任何对象安装预处理程序和后处理程序 内核指令以及函数入口和函数返回 处理程序

我正在尝试为“_do_sys_open”函数注册一个kprobe。

$ sudo cat /proc/kallsyms | grep 'do_sys_open'
ffffffff96ac0130 T do_sys_open

编写了注册 kprobe 的基本代码

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>

MODULE_LICENSE("GPL");

static struct kprobe kp;;
static char *name = "_do_sys_open";

static int pre_handler(struct kprobe *p, struct pt_regs *regs)
{
    return 0;
}

static void post_handler(struct kprobe *p, struct pt_regs *regs,
             unsigned long flags)
{
}

static int __init hello_init(void)
{
    /* set the handler functions */
    kp.pre_handler = pre_handler;
    kp.post_handler = post_handler;
    kp.symbol_name = name;
    return register_kprobe(&kp);
}

static void __exit hello_exit(void)
{
    unregister_kprobe(&kp);
}

module_init(hello_init);
module_exit(hello_exit);

加载此模块失败并显示

Unknown symbol in module

这是否意味着该函数不能与 kprobes 一起使用。

也没有被列入黑名单

# cat /sys/kernel/debug/kprobes/blacklist | grep '_do_sys_open'
c debugging linux-kernel trace kprobe
1个回答
0
投票
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>

static int pre_handler(struct kprobe *p, struct pt_regs *regs)
{
    return 0;
}

// static void post_handler(struct kprobe *p, struct pt_regs *regs,
//              unsigned long flags)
// {
//     return 0;
// }

static struct kprobe kp = {
    .symbol_name = "do_sys_open",
    .pre_handler = pre_handler,
};

static int __init hello_init(void)
{
    int ret;
    ret = register_kprobe(&kp);
    if (ret < 0) {
        return ret;
    }
    pr_info("Kprobe registered");
    return 0;
}

static void __exit hello_exit(void)
{
    unregister_kprobe(&kp);
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Kprobe module");

如果您使用以下命令加载内核,则此代码应该可以工作

sudo insmod system_protection.ko
© www.soinside.com 2019 - 2024. All rights reserved.