【发布时间】:2017-03-23 03:04:46
【问题描述】:
使用内核模块 (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。我如何告诉内核不要重置当前寄存器,以便函数可以在新的返回地址处使用它们?
【问题讨论】:
标签: linux-kernel ftrace