【问题标题】:OpenBSD Kernel module calling network functionsOpenBSD内核模块调用网络函数
【发布时间】:2012-08-08 22:30:57
【问题描述】:

作为一个概念验证,加上一个方便的偏执工具,我正在编写一个 OpenBSD LKM,它将连接到一个 IRC 通道,并在执行挂钩的系统调用时报告。

这样,当我不在现场但可以访问互联网时,我基本上可以“实时”更新文件系统更改、用户登录等。

我已经完成了连接套接字的工作,但我一直在尝试使用硬编码地址执行 getaddrinfo 甚至 inet_addr 调用。

由于这些是用户态函数,任何尝试使用它们都会导致未定义的引用——这很公平。问题是,经过一段时间的谷歌搜索和 grep 的 openbsd 源代码,我找不到任何等效的内核函数来执行此操作;最好的建议是在模块中重新实现它们。

这意味着我还需要实现诸如islowerisxdigitisspace 之类的东西(随着我的进步可能还有其他东西),执行如此简单的事情会有点多;有人知道解决方法或替代方法吗,还是我从网络文件中卡住了 c+p 代码?

【问题讨论】:

  • 与其让内核模块直接与服务器通信,为什么不让它打开一些本地通信通道(例如管道或本地套接字)并让用户级应用程序进行实际的服务器通信?跨度>
  • 为什么内核需要执行 DNS 查找?为什么你会偏执到担心系统调用正在执行,但又足够相信你的 DNS 系统是不可欺骗的?
  • 我想最小化模块的依赖数量(几乎到了独立的地步)——我不信任在内核中使用来自用户空间的数据,即使在验证之后也是如此。但是,您说的很对,因为用户级通信是执行此操作的首选和推荐方法,我只是喜欢与众不同。
  • “不同”并不总是意味着“更好的主意”:media.photobucket.com/image/unique%20fork/speedy_2/…
  • 非常正确 :D - 老实说,DNS 查找并不是什么大问题,因为我已经存储了之前调用(多年来)的所有网络服务器的 IP,并且它们在我的内部 DNS 服务器上。这就是为什么使用硬编码地址不会有太大问题的原因 - 当然,您可以处理通常的恶意/劫持服务器..

标签: c sockets bsd openbsd


【解决方案1】:

这绝对是在用户空间中做得更好。无论如何,OpenBSD 不再支持内核模块。

并不是说您正在从事这个项目。我只是想回答一下,以便可以关闭它,以便我可以澄清如何在内核中使用一些stdlib函数。

对此的回应:

这意味着我还需要实现诸如 islower、isxdigit 和 isspace 之类的东西(随着我的进步,可能还有其他东西),这对于执行如此简单的事情会有点多;有人知道解决方法或替代方法吗,还是我从网络文件中卡住了 c+p 代码?

libkern 提供了一些 C 标准库函数(请参阅 libkern(9))。其他的,包括许多 ctype 函数,如 islower(),可从 libsa 获得。要使用这些,您需要以下内容:

#include <lib/libkern/libkern.h>
#include <lib/libsa/stand.h>

libsa 包含一些标头(在 /usr/src/sys/lib/libsa/ 中找到),因此请包含您需要的每个标头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 2019-01-15
    • 2016-05-31
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多