为什么某些Linux x86_64系统调用需要存根?

时间:2014-05-19 09:26:26

标签: c linux-kernel operating-system x86-64 system-calls

如果有人试图通过sys_call_table挂钩某些系统调用 - 挂钩,例如sys_execve这会失败,因为它们是由存根间接调用的。对于sys_execve,这是stub_execve(比较LXR上的汇编代码)。

但这些存根有什么用呢?为什么只有execve(2)fork(2)之类的某些系统调用需要存根以及如何连接到x86_64?是否存在挂钩存根系统调用(在可装入内核模块中)的解决方法?

1 个答案:

答案 0 :(得分:2)

来自here,它说:

  

“需要保存完整的完整堆栈帧的某些特殊系统调用。”

我认为execve只是这些特殊系统调用之一。

stub_execve的代码中,如果要挂钩,至少可以尝试:
(1)了解这些汇编代码的含义并自行完成,然后您可以在自己的汇编代码中调用自己的函数。
(2)从汇编代码的中间,它有call sys_execve,你可以将sys_execve的地址替换为你自己的钩子函数。