kprobe 处理程序未针对特定功能触发
kprobe handler not getting triggered for specific function
我正在尝试使用 kprobes 拦截模块中的以下函数。 "register_kprobe" 此函数已通过,但调用函数时未触发 Kprobe 处理程序。
奇怪的是,如果我在探测函数中打印函数地址,它就会开始工作(调用 kprobe 处理程序)。它也适用于内核中的其他功能。
为什么 kprobe 处理程序没有被触发以及打印函数地址有什么不同?
系统在 x86_64 安装了 3.10 内核。
无效代码:
int race;
void test_increment()
{
race++;
printk(KERN_INFO "VALUE=%d\n",race);
return;
}
工作代码:
int race;
void test_increment()
{
race++;
printk(KERN_INFO "test_increment address: %p\n", test_increment);
printk(KERN_INFO "VALUE=%d\n",race);
return;
}
正在调用 func(它被注册为写入 debugfs 文件的回调):
static ssize_t write_conf_pid(struct file *file, const char *buf,
size_t count, loff_t *position)
{
char temp_str[STRING_MAX];
int ret;
if (copy_from_user(temp_str, buf, STRING_MAX) != 0)
return -EFAULT;
/* NEVER TRUST USER INPUT */
if (count > STRING_MAX)
return -EINVAL;
test_increment();
return count;
}
kprobe 函数:
kp = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
kp->post_handler = exit_func;
kp->pre_handler = entry_func;
kp->addr = sym_addr;
ret = register_kprobe(kp);
谢谢。
您没有提供调用函数的代码。
最有可能发生的情况是,编译器在调用点内联了正文,并且添加了 priting 地址说服它生成完整的正文并改为调用它。拆开应该很容易检查。
然而,实际问题总是一样的:你在做什么?
我正在尝试使用 kprobes 拦截模块中的以下函数。 "register_kprobe" 此函数已通过,但调用函数时未触发 Kprobe 处理程序。
奇怪的是,如果我在探测函数中打印函数地址,它就会开始工作(调用 kprobe 处理程序)。它也适用于内核中的其他功能。
为什么 kprobe 处理程序没有被触发以及打印函数地址有什么不同?
系统在 x86_64 安装了 3.10 内核。
无效代码:
int race;
void test_increment()
{
race++;
printk(KERN_INFO "VALUE=%d\n",race);
return;
}
工作代码:
int race;
void test_increment()
{
race++;
printk(KERN_INFO "test_increment address: %p\n", test_increment);
printk(KERN_INFO "VALUE=%d\n",race);
return;
}
正在调用 func(它被注册为写入 debugfs 文件的回调):
static ssize_t write_conf_pid(struct file *file, const char *buf,
size_t count, loff_t *position)
{
char temp_str[STRING_MAX];
int ret;
if (copy_from_user(temp_str, buf, STRING_MAX) != 0)
return -EFAULT;
/* NEVER TRUST USER INPUT */
if (count > STRING_MAX)
return -EINVAL;
test_increment();
return count;
}
kprobe 函数:
kp = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
kp->post_handler = exit_func;
kp->pre_handler = entry_func;
kp->addr = sym_addr;
ret = register_kprobe(kp);
谢谢。
您没有提供调用函数的代码。
最有可能发生的情况是,编译器在调用点内联了正文,并且添加了 priting 地址说服它生成完整的正文并改为调用它。拆开应该很容易检查。
然而,实际问题总是一样的:你在做什么?