访问内核2.6+中的sys_call_table

时间:2012-01-12 18:28:45

标签: c linux operating-system linux-kernel

是否有可能从我自己的sys_call_table模块访问Kernel 2.6+?如果有人可以提供文章或方法的链接,我将不胜感激。我需要一种方法,而无需修改Kernel源代码。我知道在Linux 2.4 Kernel上很容易,您可以使用外部符号,但此功能已从Kernel 2.6中移除。

3 个答案:

答案 0 :(得分:2)

你真正要做的就是用自己的函数替换一个系统调用,我建议使用kprobes来完成这类工作,你可以轻松地打破任何内核地址(或符号(例如sys_exit,sys_whateversyscall)并改变执行路径,所有这些在运行时,如果你需要的话,还有一个内核模块:)它的开销非常低。

Kprobes(或者jprobes,如果你只是将你的代码添加到系统调用而不是完全替换它)通过中断动态替换指令(例如你的系统调用条目的第一条指令)(例如x86上的int3)。在do_int3处理程序中,通知程序通知kprobes,kprobes又将执行传递给您的注册函数,此时您几乎可以执行任何操作。

在Documentation / kprobes.txt中给出了一个非常好的文档,这是samples / kprobes / kprobes_example.c中的一个小例子(在这个例子中,它们在do_fork上中断以记录系统上的每个fork)。它有一个非常简单的API,现在非常便于携带。

答案 1 :(得分:1)

我已经回答了一些与此类似的问题:

对我的TPE LKM模块进行深入解释,请参阅我的博客上的this explanation

注意:正如您对问题的评论所述,这不是正确的做事方式。最好是重新编译内核,但我确实知道有些情况不适合。

答案 2 :(得分:0)

由于内核2.6。*系统调用表不再导出。在这里您可以找到如何重新导出它:

http://www.sans.org/reading_room/whitepapers/honors/linux-kernel-rootkits-protecting-systems_1500

请参阅第144页。