我正在尝试挂钩一些内核函数以用于学习目的,我在下面编写了简单的内核模块,但由于某些原因,register_kprobe总是返回 -2。我没有发现它所说的这个错误意味着什么,也不知道如何继续。起初我以为是因为它list_add是一个内联函数,所以我尝试将其替换为kvm_create_vm并得到相同的结果。然后我检查/proc/kallsyms并发现两者都没有出现在那里。所以我选择了我也试过kvm_alloc哪个是导出的,但我仍然得到错误-2。alloc_uid,但这工作得很好。
我的问题:可以连接什么样的功能kprobes?
#undef __KERNEL__
#define __KERNEL__
#undef MODULE
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/kprobes.h>
#include <linux/ptrace.h>
MODULE_LICENSE("GPL");
static int pre(struct kprobe *kp, struct pt_regs *regs){
printk(KERN_INFO "It is working!\n");
return 0;
}
static struct kprobe kp = {
.symbol_name = "list_add",
.pre_handler = pre,
.post_handler = NULL,
.fault_handler = NULL
};
int init_module(void){
printk(KERN_INFO "Hi\n");
printk(KERN_INFO "register_kprobe: %d\n" , register_kprobe(&kp));
return 0;
}
void cleanup_module(void){
unregister_kprobe(&kp);
printk(KERN_INFO "Bye\n");
}
编辑
我划过的线是我感到困惑的主要原因。我错过了拼写kvm_alloc,它应该kvmalloc没有下划线。这个功能很好地被钩住了。