如何在不修改和预先发布linux内核的情况下替换静态内核函数

时间:2011-06-01 02:28:15

标签: linux linux-kernel

全部 我想知道如何在不修改linux内核的情况下替换模块中的内核静态函数。 我知道Linux hook可以替换一些函数,但是 问题是我想在不修改linux内核的情况下替换静态函数。 你能帮帮我吗? 谢谢。

3 个答案:

答案 0 :(得分:4)

一般来说,Linux内核的编译方式,在运行时替换/挂钩静态函数是不可能的(如果您正在讨论模块代码,则无法卸载/重新加载整个模块。)

这是因为编译内联 static在很多时候起作用(除非你把它的地址带到某个地方),因此它们甚至不会出现在符号表中。在编译之后没有办法找出生成的二进制文件中static代码的最终位置 - 并非不太可能,你会在所有调用func的调用站点中找到它的几个内联版本。

所以基本问题:为什么函数必须是static?你试图做的是什么,要求使用static

答案 1 :(得分:1)

如果它实际编译为模块(非内置),则只需重新编译代码,rmmod模块,insmod.ko文件。很容易...某种陈词滥调的糕点。

答案 2 :(得分:0)

一般情况下,您可以使用以下技巧:

  • kprobes / jprobes,允许您使用int3
  • 挂钩函数
  • 修改函数的代码(例如,序言)以跳转到处理程序并稍后返回

如果您根本不想修改内核的代码,可以设置调试寄存器并注意访问异常(当然,在异常处理程序中)。除此之外,您可以尝试查找并使一些内核的内部变量无效,以便从内核访问它们会导致无效的指针解除引用异常。在这种情况下,您可以处理此类异常并对达到目标函数执行反向跟踪。