2016-09-27 38 views
0

是否可以使用LD_PRELOAD来覆盖其中一个Linux内核函数?在内核级函数上使用LD_PRELOAD

例如,我想更改函数Linux/net/ipv4/syncookie.c为我的程序fooserver的监听套接字。我可以使用LD_PRELOAD来完成,还是我需要重新编译内核?

还有其他的选择吗?

感谢,

+1

LD_PRELOAD伎俩将工作仅适用于动态链接的库你说的e代码很可能是静态链接的。或者如果你幸运的话,可以坐在可载入模块中。在这种情况下,您可以更换模块.. –

+0

@EugeneSh .:如果用户可以轻松更换内核函数,您不会看到严重的安全问题吗? – Olaf

+0

除恶意软件:你为什么要这么做? – Olaf

回答

2

不,这是不可能使用LD_PRELOAD内核替换功能。

您将需要重新编译内核。

如果函数在内核模块中,那么您可以卸载,重新编译和重新加载模块,而无需重新启动内核。

如果这是您经常要做的事情,那么您将需要使用第二台计算机或虚拟机,因此您不必继续重新启动正在编程的计算机。

0

您必须使用kprobes或systemtap覆盖内核函数。没有必要重新编译。

0

你可以在Linux Kernel中做类似的事情。 这不是一个简单的操作,但你应该做的是下一个:

  1. 查找要被替换的函数的地址。有几种方法可以实现地址。最简单的是'cat/proc/kallsyms | grep的cookie_hash”。
  2. 从你的模块,你保存地址的内容。它是最初的‘cookie_hash’功能。
  3. 进入这个地址,你把你的函数‘my_cookie_hash’的地址。
  4. 在你的函数“my_cookie_hash”的末尾,你调用原始功能“cookie_hash”。

有许多隐藏的陷阱和潜在的崩溃,虽然。 但是总体来说,这种方法的工作原理。