替换linux内核3中的系统调用
Posted
技术标签:
【中文标题】替换linux内核3中的系统调用【英文标题】:Replace system call in linux kernel 3 【发布时间】:2012-01-07 00:31:09 【问题描述】:我有兴趣用我将在 linux 内核 3 中实现的自定义替换系统调用。 我读到 sys 调用表不再公开。
有什么想法吗?
对这个 http://www.linuxtopia.org/online_books/linux_kernel/linux_kernel_module_programming_2.6/x978.html 示例的任何引用,但对于内核 3 将不胜感激:)
谢谢!
【问题讨论】:
是否有理由需要更换一个,而不仅仅是添加一个新的系统调用? @Kristian,原因是使用内核模块监视通过给定系统调用的调用。希望用于调试目的:-) 那他为什么不能直接修改源代码中已有的调用呢?它们都应该在arch/<architecture>/kernel/
中可用
为什么syscall表的暴露有问题?你打算编译一个新内核,还是劫持现有内核?
@Kristian,因为那时您需要重新编译内核,只需编译并插入内核模块以激活“功能”并对其进行 rmmod 停用它会更容易。
【参考方案1】:
我建议使用 kprobes 来完成这种工作,您可以轻松地中断任何内核地址(或符号...)并更改执行路径,所有这些都在运行时使用内核模块,如果您需要: )
Kprobes 通过用中断(例如 x86 上的 int3)动态替换指令(例如系统调用条目的第一条指令)来工作。在 do_int3 处理程序中,通知程序通知 kprobes,然后 kprobes 将执行传递给您注册的函数,从那时您几乎可以做任何事情。
Documentation/kprobes.txt 中提供了一个非常好的文档,因此作为 samples/kprobes/kprobes_example.c 中的一个小示例(在此示例中,它们中断 do_fork 以记录系统上的每个分支)。它有一个非常简单的 API,并且现在非常便携。
警告:如果您需要更改执行路径,请确保您的 kprobe 未优化(即处理程序的 jmp 指令替换您中断的指令而不是 int3)否则您赢了' 不能真正轻易地改变执行(在你的函数的 ret 之后,系统调用函数仍将照常执行)。如果您只对跟踪感兴趣,那么这很好,您可以放心地忽略此问题。
【讨论】:
抱歉,我刚刚阅读了有关您问题的 cmets。似乎您只想知道某人何时通过 sshd 登录。 ptrace() 已被建议,但恕我直言,不利的性能方面确实不值得。如果您只想在有人使用 sshd 登录时收到通知,那么您最好只使用 sshd 日志。您可以编写一个读取这些日志的 crontab 作业,并在每次成功/拒绝登录时向您发送一封电子邮件。您可以用脚本语言编写所有这些,这可以大大减少开发时间。在你的情况下。 没错!我会调查您建议的 kprobe,如果它适用于我的情况,我会回复 :) 谢谢!!! 我调查了jprobes,真的很棒!我唯一担心的是,当接受系统调用接受套接字连接时,我不知道调用哪个内核例程:( 对于 tcp 连接是 tcp_connect!现在我只需要找到新的 UDP 连接的调用! 我很高兴它适合您的需要 :) 通常要在内核中查找系统调用函数,您只需添加前缀sys_
,因此对于所有接受(tcp 和 udp),您通常会在sys_accept
上中断。是的,当您想要的只是跟踪时,jprobes 非常适合使用!有更高级别的接口在内部使用 kprobes,您可能会发现它们很有用,例如 ftrace:您甚至不需要编写内核模块,但可以在 debugfs 中使用接口,请阅读 Documentation/trace/ftrace 了解更多信息。还有审计子系统,但是你需要写一个守护进程。【参考方案2】:
写一个LKM,会更好的选择。替换是什么意思,要不要添加一个新的。
【讨论】:
我不想添加新的。我想在调用系统调用时收到通知并从它的参数中提取一些信息 替换和添加是软件工程中两个基本且明确的操作。你真的需要问replace是否意味着add?</passive-aggressive>
以上是关于替换linux内核3中的系统调用的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理mmap 系统调用源码分析 ① ( mmap 与 mmap2 系统调用 | Linux 内核中的 mmap 系统调用源码 )