【问题标题】:access to the sys_call_table in kernel 2.6+访问内核 2.6+ 中的 sys_call_table
【发布时间】:2012-01-12 18:28:45
【问题描述】:

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

【问题讨论】:

  • 这个功能被删除了,因为它通常是错误的方式来做你想做的任何事情,而且它让rootkits太容易了。你到底想做什么?
  • 尝试用我自己的方法替换系统调用。
  • Module 总是错误的方式来修改系统调用...
  • @Roman 然后 kprobes(尤其是 jprobes,如果您只需要跟踪)特别适合这项工作。它通过使用您要跟踪的函数(或您的情况下的系统调用)的相同原型注册处理程序来工作。每次系统调用将被命中时,您的处理程序将使用与之前的系统调用相同的参数进行调用。如果您只想进行跟踪,则可以使用 ftrace API 在用户空间中进行所有操作。

标签: c linux operating-system linux-kernel


【解决方案1】:

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

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

Documentation/kprobes.txt 中提供了一个非常好的文档,因此作为示例/kprobes/kprobes_example.c 中的一个小示例(在此示例中,它们在 do_fork 上中断以记录系统上的每个分支)。它有一个非常简单的 API,并且现在非常便携。

【讨论】:

    【解决方案2】:

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

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

    注意:正如您问题的 cmets 中所述,这不是正确的做事方式。最好重新编译内核,尽管我知道在某些情况下这不是一个选项。

    【讨论】:

      【解决方案3】:

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

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

      请看第 144 页。

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        • 2011-09-03
        相关资源
        最近更新 更多