内核热补丁的黑科技
从一个例子开始
static int livepatch_cmdline_proc_show(struct seq_file *m, void *v)
{
seq_printf(m, "%s\n", "this has been live patched");
return 0;
}
static struct klp_func funcs[] = {
{
.old_name = "cmdline_proc_show",
.new_func = livepatch_cmdline_proc_show,
}, { }
};
static struct klp_object objs[] = {
{
/* name being NULL means vmlinux */
.funcs = funcs,
}, { }
};
static struct klp_patch patch = {
.mod = THIS_MODULE,
.objs = objs,
};
static int livepatch_init(void)
{
return klp_enable_patch(&patch);
}来点难的
klp_patch的数据结构
真正的干货
klp_get_ftrace_location
ops->fops.func = klp_ftrace_handler
ftrace_set_filter_ip
register_ftrace_function
惊人一跃
补充知识 -- 函数返回地址
实验代码
验证返回地址在堆栈上
修改返回地址
Last updated