2014-12-07 24 views

回答

2

在linux中sys_call_table包含所有系統調用的函數指針。這個表最初是在2.4的日子裏被導出的,然後它變成了靜態的,然後它又被導入了一些最新的內核。讓我們舉兩個例子。

案例1. sys_call_table已導出。

在內核模塊中使用以下行。

sys_call_table [AVAILABLE_INDEX] = new_sys_call;

新的系統調用可以實現爲。

asmlinkage new_sys_call(...){}

案例 - 2)sys_call_table的不出口。

嘗試通過在System.map

grepping獲得sys_call_table的地址$貓System.map | grep的sys_call_table的

硬代碼的模塊中的值。

如果這不可用,那麼我們需要動態確定表格地址。 sys_call_table最有可能在內核文本部分的開頭。

通過以下步驟來計算的sys_call_table的

  1. 基地址查找其旁邊放置成彼此在 表(從源代碼)兩個系統調用。例如:sys_read,sys_open。

  2. 獲取這些sys調用的地址。

  3. 從文本部分的開頭搜索這兩個地址。

    (通過文字部分的計算開始,objdump的-H的vmlinux | grep的 「的.text」)

  4. 當你發現它,計算的sys_call_table的基礎上,根據自己的 相對偏移。