有没有可能从我自己的sys_call_table
模块访问Kernel 2.6+
?如果有人能给文章或如何做的链接,我将不胜感激。我需要一个不需要修改源代码的方法。我知道在Kernel
上很容易,你可以使用外部符号,但是这个能力从Linux 2.4 Kernel
中移除了。
最佳答案
正如您真正想要做的是用自己的函数替换一个SysCurl,我建议使用KSOCKET来完成这类工作,您可以轻松地在任何内核地址(或符号(例如SysSeXead,SysSthWutySysCurle))上进行修改,并在运行时更改执行路径,如果需要的话,使用内核模块:它具有非常低的开销。
kprobes(或者jprobes,如果您只是将代码添加到syscall而不是完全替换它)通过动态地将指令(例如syscall条目的第一条指令)替换为中断(例如x86上的int3)来工作。在do_int3处理程序中,通知程序通知kprobes,kprobes反过来将执行传递给注册的函数,从那时起,您几乎可以执行任何操作。
documentation/kprobes.txt中提供了一个非常好的文档,因此在samples/kprobes/kprobes_example.c中是一个很小的示例(在本例中,它们在do_fork上中断以记录系统上的每个fork)。它有一个非常简单的api,现在是非常可移植的。