一、System.map
獲取sys_call_table的位址,最簡單的方法是查看/boot底下的System.map檔案,裡面就有標記sys_call_table的位址。
二、entry_64.S
在arch\x86\entry路徑下的entry_64.S檔案,裡面的程式碼有調用到sys_call_table(在entry_SYSCALL_64裡面),因此我們可以藉由它來獲取sys_call_table的位址。
我們還需要知道怎樣獲取entry_SYSCALL_64的位址,從arch\x86\kernel\cpu路徑下的common.c裡有初始化entry_SYSCALL_64的位址,它會利用wrmsrl將entry_SYSCALL_64的位址寫到MSR_LSTAR暫存器,因此我們只要透過rdmsrl,將它讀取出來就行了。
三、獲取sys_call_table實作
從上述的理論寫個小程式,再利用dmesg指令,將printk的訊息印出來,這樣我們就能輕鬆的獲取sys_call_table的位址了,最後只要sys_call_table[__NR_open] = own_open,就能攔截(Hook)sys_open啦!