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

Pro*_*iol 6 c operating-system x86-64 system-calls linux-kernel

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

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

小智 3

这里开始,它说:

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

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

从stub_execve的代码来看,如果你想hook它,至少你可以尝试:

  1. 了解这些汇编代码的含义并自己编写,然后您就可以在自己的汇编代码中调用自己的函数。
  2. 从汇编代码中间,有一个call sys_execve,你可以将 sys_execve 的地址替换为你自己的钩子函数。