[英]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.