2016-09-27 64 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」。

有許多隱藏的陷阱和潛在的崩潰,雖然。 但是總體來說,這種方法的工作原理。