進程請求核心服務(開檔、建立進程、申請記憶體)皆透過系統呼叫。修改核心行為的關鍵在於此。strace 命令 參數 可查看程式使用的系統呼叫。
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_open,完成時呼叫原始 sys_openB_open,完成時呼叫它以為的「原始」——實為 A_openA_opensys_open,B 被排除。B 後移除時嘗試恢復為已不存在的 A_open → 系統崩潰即使加入檢查「系統呼叫是否等於我們的函數」也無法根本解決:A 移除後系統呼叫變為 B_open,無法恢復 A_open,但 B_open 仍會嘗試呼叫已消失的 A_open。結論:多模組攔截同一系統呼叫極度危險,生產環境應避免。