簡體   English   中英

在Linux 3.x上掛鈎sys_execve()

[英]Hooking sys_execve() on Linux 3.x

我試圖通過修改系統調用表來掛鈎Linux 3.x內核上的sys_execve()函數。 問題是sys_execve()只應在執行失敗時返回錯誤代碼。 使用我正在使用的包裝器函數(見下文),當在有效的可執行文件上調用sys_execve()時,它執行正常並且一切正常。 但是,當調用不存在的文件或導致錯誤情況的其他內容時,調用程序將崩潰:

segfault at 3b ip 000000000000003b...

使用strace檢查鈎子sys_execve()的返回值,顯示-1或ENOSYS而不是正確的錯誤代碼,這讓我感到困惑,因為我檢查了我的包裝函數的程序集以及sys_execve()的Linux源代碼。 有關為什么我的包裝器沒有正確傳遞錯誤代碼的任何建議?

asmlinkage long new_execve(const char* name, const char const** argv, const char const** envp, struct pt_regs* regs) {
    return orig_func(name, argv, envp, regs);
}

你不能通過修改系統調用表來掛鈎execve ,就像在x86_64上從stub_execve調用sys_execve stub_execve 所以調用鏈是sys_call_table[NR_execve] -> stub_execve -> sys_execve -> do_execve ...看看LXR上的stub_execve

在過去,在Linux內核中掛鈎系統調用是一項更容易的任務,但是,在較新的內核中,程序集存根被添加到系統調用中。 為了解決這個問題,我動態修補了內核的內存。

你可以在這里查看我的完整解決方案來掛鈎sys_execve: https//github.com/kfiros/execmon

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM