2011-09-01 97 views
1

我正在編寫一個內核模塊,通過控制校驗和來檢查運行任務的代碼段的完整性。我遇到了一些障礙:Linux內核模塊檢查內存的完整性

  1. 我怎樣才能獲得module_list變量,如果它不是由內核導出(有沒有這樣的符號ksyms)?我可以看到所有調用lsmod命令的模塊,所以我怎麼才能在我的模塊中得到它?
  2. 雖然我的模塊正在運行,但它顯示某些代碼段已更改。它總是發生在某些圖書館。爲什麼會發生?我認爲代碼段是不變的。
  3. 是否可以控制內核模塊的進程數據的內存訪問以及如何執行?
+0

我不明白問題3.你是什麼意思「是真的嗎?」你想要什麼樣的控制? –

+0

簡單地說,我想控制一些任務修改它自己的數據或代碼的事實 –

回答

4

完全支持自修改代碼。它沒有什麼不對,它被用於各種各樣的事情。你認爲代碼不變是不正確的。它可能是,但它可能不是。

一個典型的例子是SMP與UP系統。例如,在Pentium 4類Xeon機器上,未鎖定增量可能比鎖定增量少60個週期。鎖定的增量僅在SMP機器上需要。爲了在UP和SMP機器上運行相同的代碼而不會在運行時產生條件開銷,通常會使用自修改代碼。代替lock指令,使用非法操作碼,例如ud2。非法指令中斷被捕獲,ud2被SMP系統上的lock和UP系統上的nop取代。

內核輸出模塊接口。導出的是:

__module_text_address __symbol_get symbol_put_addr use_module 
module_layout module_put __module_put_and_exit module_refcount 
register_module_notifier __symbol_put unregister_module_notifier module_get 

您也可以解析/proc/modules,如果你真的想。

+0

我的內核不會導出這樣的符號 –

+0

然後修改它以便它。這是開源軟件的偉大之處。 (什麼版本?它導出了什麼?grep爲「模塊」或「符號」。) –

+0

除了指令替代方法外,還有一些跟蹤/調試工具依賴修改內核本身的內存映像和模塊。內核標記和Ftrace是第一個想到的。例如,Ftrace(在x86上)可能會在每個函數的前言('call mcount')之後用其他函數的調用永久替換剩餘的5個字節以收集必要的數據。 – Eugene