2011-12-04 39 views
4

我試圖通過修改系統調用表來掛鉤Linux 3.x內核上的sys_execve()函數。問題是如果執行不成功,sys_execve()只能返回錯誤代碼。使用我正在使用的包裝器功能(請參閱下文),當在有效的可執行文件上調用sys_execve()時,它可以正常執行並且一切正常。然而,當它被稱爲一個不存在的文件或其他東西會導致一個錯誤條件,調用程序會崩潰與:在Linux 3.x上掛接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); 
} 
+0

這可能是不相關的,但我很感興趣,在Linux> 3替換系統調用。你能否提供一些有關這方面的信息。 – gaurav

回答

3

您不能作爲x86_64sys_execvestub_execve稱爲一個這樣的方式修改系統調用表掛鉤execve。所以呼叫鏈是sys_call_table[NR_execve] -> stub_execve -> sys_execve -> do_execve ...看看LXR上的stub_execve

0

過去,在Linux內核中掛接系統調用是一件容易的事,然而,在較新的內核中,程序集存根被添加到系統調用中。爲了解決這個問題,我修補了內核的內存。

您可以查看我的完整的解決方案在這裏鉤住sys_execve:https://github.com/kfiros/execmon