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

问题描述

|| 所有, 我想知道如何在不修改linux内核的情况下替换模块中的内核静态函数。 我知道Linux挂钩可以代替某些功能,但是 问题是我想在不修改Linux内核的情况下替换静态函数。 你能帮我吗? 谢谢。     

解决方法

        通常,Linux内核的编译方式无法在运行时替换/挂钩静态函数(如果您正在谈论模块代码,则无法卸载/重新加载整个模块)。 那是因为大多数情况下,编译内联符
static
起作用(除非将其地址带到某个地方),因此它们甚至不会显示在符号表中。编译后没有办法找出binary0ѭ代码在生成的二进制文件中的位置-不太可能,您会在调用该func的所有调用站点中找到它的多个内联版本。 因此,基本问题是:为什么函数必须为“ 0”?您正试图执行
static
的确切含义是什么?     ,        如果它实际上是作为模块编译的(不是内置的),则只需重新编译代码,将模块“ 4”,再“ 5”新的“ 6”文件。像...一样陈词滥调的糕点。     ,        通常,您可以使用以下一些技术: kprobes / jprobes,可让您用ѭ7钩住函数 修改函数的代码(例如,序言)以跳转到处理程序并稍后返回 如果您根本不想修改内核的代码,则可以设置调试寄存器并监视访问异常(当然在异常处理程序中)。除此之外,您可以尝试查找并使内核的一些内部变量无效,以便从内核访问它们会导致无效的指针取消引用异常。在那种情况下,您可以处理此类异常并进行追溯以实现目标功能。