我正在尝试在linux 2.6.32.60 x86内核中实现功能,这将允许我根据我在任务结构中添加的字段来阻止所有系统调用。这基本上是以下形式:
task_struct ts;
if(ts-> added_field == 0)
//do system call normally
else
//don't do system call
我想知道是否应该在entry_32.S中直接执行此操作,或者是否可以修改syscall表在其他地方调用的方式。直接修改entry_32.S的问题是我不知道是否可以访问正在进行调用的任务结构。
感谢您的帮助!
答案 0 :(得分:1)
如果我这样做,我会挂钩__kernel_vsyscall(),如果任务结构按照你上面的逻辑表明,就停止发送。
具体来说,arch / i386 / kernel / vsyscall-sysenter.S在每个进程的地址空间之间共享,是所有系统调用的入口点。这是在调度实际系统调用之前的位置,在我看来,这是放置钩子的地方。您位于进程的地址空间中,因此您应该可以访问任务结构的mm-> current。 (另见arch / sh / kernel / vsyscall / vsyscall.c)
答案 1 :(得分:1)
内核已经有一个非常相似的功能,称为seccomp(LWN article)。您可能需要考虑将此功能基于此,而不是实现新功能。