3.1 系統調用的功能
Linux中進程運行的模式有兩個:用戶態和內核態。運行的用戶態的進程功能比較少,要想與硬件設備交互就必須切換到內核態。系統調用就是進程由用戶態進入到內核態的唯一入口。
這種實現方式有很多優點:
(1)簡化編程方式
編碼人員不需要學習過多的硬件設備的編程特性;
(2)極大地提高了系統的安全性
內核在滿足莫個請求之前在接口級就可以檢查這種請求的合法性;
(3)增強了程序的可移植性
系統通過維持接口不變來隱藏了不同的底層平臺和硬件的差異,使得應用程序的跨平臺移植更加容易。
3.2 系統調用的實現方式
Linux所有的系統調用的執行流程都是:(1)在用戶態發起系統調用請求
(2)進程切換到內核態
(3)找到sys_call_table中與系統調用號對應的函數
(4)執行內核函數
(5)返回到用戶態
根據進程切換到內核態所執行指令的不同系統調用可分爲int 0x80模式、sysenter模式和syscall模式三種。
int 0x80中斷模式是最古老的模式,它通過用戶態進程使用int指令發起0x80中斷的方式進入內核態,由相應的內核中斷處理函數找到sys_call_table中的函數並執行。
進程使用sysenter指令也可以切換到內核態,且效率比int 0x80方式更高。在CPU支持sysenter的情況下,系統調用由sysenter指令實現。
在32位系統中Linux使用int 0x80和sysenter切換到內核態,在64位環境下使用的時syscall指令。
3.3 系統調用劫持簡介
系統調用劫持是指在內核設置hook點,使得所有系統調用在陷入到先調用hook點中的函數,然後才調用真正的內核處理函數。這樣就能截獲並控制系統調用。
系統調用劫持的方法有:
(1)截獲sys_call_table
(2)截獲0x80中斷向量
(3)截獲sysenter處理函數指針
(4)截獲syscall處理函數指針
接下來詳細討論各種劫持方法。