使用内核模块 (LKM),Linux 内核ftrace
函数允许您设置FTRACE_OPS_FL_SAVE_REGS
和FTRACE_OPS_FL_IPMODIFY
标志,本质上允许您完全重定向任何可以找到符号地址的内核函数,如下所示:
static void notrace my_ftrace_handler(unsigned long ip, unsigned long parent_ip,
struct ftrace_ops *fops, struct pt_regs *regs) {
regs->ip = new_addr;
}
new_addr
新函数的地址在哪里。该kpatch
工具使用它,尽管从未返回到原始功能。
如果在我指向的函数的末尾,new_addr
我试试这个:
task_pt_regs(current)->ip = orig_addr + MCOUNT_INSN_SIZE;
一些函数可以正常运行,但大多数会导致调用进程出现段错误。
这些ftrace
函数具有内置代码,可pt_regs
在返回到原始函数时恢复当前任务,这就是为什么我能够转到自己的函数并毫无问题地拥有参数。但是,此时在代码中,ftrace
不再涉及。我如何告诉内核不要重置当前寄存器,以便函数可以在新的返回地址处使用它们?