在内核级函数上使用LD_PRELOAD

时间:2016-09-27 21:32:40

标签: c linux-kernel kernel ld-preload

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

例如,我想更改cookie_hash中的Linux/net/ipv4/syncookie.c函数作为我的程序fooserver的侦听套接字。我可以使用LD_PRELOAD来做,或者我需要为此重新编译内核吗?

还有其他选择吗?

谢谢,

3 个答案:

答案 0 :(得分:2)

不,不可能使用LD_PRELOAD替换内核中的函数。

您需要重新编译内核。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  1. 找到要替换的功能的地址。有几种方法可以实现该地址。最简单的是'cat / proc / kallsyms | grep cookie_hash“。
  2. 从您的模块中,您可以保存地址的内容。这是原来的'cookie_hash'功能。
  3. 在此地址中,您可以放置​​函数'my_cookie_hash'的地址。
  4. 在您的函数'my_cookie_hash'结束时,您调用原始函数'cookie_hash'。
  5. 但是有许多隐藏的陷阱和潜在的崩溃。 但一般来说,这种方法有效。