【发布时间】:2014-07-07 04:51:15
【问题描述】:
如果有人试图通过sys_call_table-hooking 来挂钩某些系统调用,例如sys_execve 这将失败,因为它们被存根间接调用。对于sys_execve,这是stub_execve(比较LXR 上的汇编代码)。
但是这些存根有什么用呢?为什么只有像execve(2) 和fork(2) 这样的某些系统调用需要存根,它是如何连接到x86_64 的?是否有解决方法来挂钩存根系统调用(在可加载内核模块中)?
【问题讨论】:
-
从这个文件的顶部开始 lxr.free-electrons.com/source/arch/x86/kernel/entry_64.S
Normal syscalls and interrupts don't save a full stack frame, this is only done for syscall tracing, signals or fork/exec et.al.。所以基本上答案是:考虑到这个函数在跟踪和调试中发挥的关键作用,我们需要在每个事件期间保存和查看尽可能多的寄存器。 -
courses.cms.caltech.edu/cs124/lectures/CS124Lec09.pdf 幻灯片 21 和 22 清楚地介绍了大多数操作系统中的这个存根,基本上,
Allows the OS’ interrupt service routines to be more uniform和OSes frequently use short stubs of assembly code to invoke their interrupt service routines (ISRs)~ 这张幻灯片对我有很大帮助,希望对你有帮助: )
标签: c linux-kernel operating-system x86-64 system-calls