萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 核心模組程式設計:系統呼叫攔截與 sys_call_table 修改風險

系統呼叫:核心與進程溝通的真正管道

進程請求核心服務(開檔、建立進程、申請記憶體)皆透過系統呼叫。修改核心行為的關鍵在於此。strace 命令 參數 可查看程式使用的系統呼叫。

運作機制

  • 進程填充暫存器 → 執行特定跳轉指令(Intel 用 int 0x80) → 進入核心 system_call 區域
  • 硬體偵測到跳轉,從用戶模式切換到核心模式(保護模式)
  • system_call 檢查呼叫號 → 查 sys_call_table 找對應核心函數 → 呼叫 → 返回後檢查 → 回用戶進程
  • 原始碼見 arch/x86/kernel/entry.S 的 ENTRY(system_call)

攔截系統呼叫的方法與風險

自訂函數(如 our_sys_open)替換 sys_call_table 對應項,執行額外邏輯(如記錄特定 UID 開啟的檔案)後呼叫原始函數。init_module 替換並保存原指標,cleanup_module 恢復。

多模組同時修改同一系統呼叫的災難性後果

  • 模組 A 替換為 A_open,完成時呼叫原始 sys_open
  • 模組 B 其後替換為 B_open,完成時呼叫它以為的「原始」——實為 A_open
  • 若 B 先移除:正常,恢復為 A_open
  • 若 A 先移除:恢復為 sys_open,B 被排除。B 後移除時嘗試恢復為已不存在的 A_open → 系統崩潰

即使加入檢查「系統呼叫是否等於我們的函數」也無法根本解決:A 移除後系統呼叫變為 B_open,無法恢復 A_open,但 B_open 仍會嘗試呼叫已消失的 A_open。結論:多模組攔截同一系統呼叫極度危險,生產環境應避免。

copyright © 萬盛學電腦網 all rights reserved