【发布时间】:2012-08-08 22:30:57
【问题描述】:
作为一个概念验证,加上一个方便的偏执工具,我正在编写一个 OpenBSD LKM,它将连接到一个 IRC 通道,并在执行挂钩的系统调用时报告。
这样,当我不在现场但可以访问互联网时,我基本上可以“实时”更新文件系统更改、用户登录等。
我已经完成了连接套接字的工作,但我一直在尝试使用硬编码地址执行 getaddrinfo 甚至 inet_addr 调用。
由于这些是用户态函数,任何尝试使用它们都会导致未定义的引用——这很公平。问题是,经过一段时间的谷歌搜索和 grep 的 openbsd 源代码,我找不到任何等效的内核函数来执行此操作;最好的建议是在模块中重新实现它们。
这意味着我还需要实现诸如islower、isxdigit 和isspace 之类的东西(随着我的进步可能还有其他东西),执行如此简单的事情会有点多;有人知道解决方法或替代方法吗,还是我从网络文件中卡住了 c+p 代码?
【问题讨论】:
-
与其让内核模块直接与服务器通信,为什么不让它打开一些本地通信通道(例如管道或本地套接字)并让用户级应用程序进行实际的服务器通信?跨度>
-
为什么内核需要执行 DNS 查找?为什么你会偏执到担心系统调用正在执行,但又足够相信你的 DNS 系统是不可欺骗的?
-
我想最小化模块的依赖数量(几乎到了独立的地步)——我不信任在内核中使用来自用户空间的数据,即使在验证之后也是如此。但是,您说的很对,因为用户级通信是执行此操作的首选和推荐方法,我只是喜欢与众不同。
-
“不同”并不总是意味着“更好的主意”:media.photobucket.com/image/unique%20fork/speedy_2/…
-
非常正确 :D - 老实说,DNS 查找并不是什么大问题,因为我已经存储了之前调用(多年来)的所有网络服务器的 IP,并且它们在我的内部 DNS 服务器上。这就是为什么使用硬编码地址不会有太大问题的原因 - 当然,您可以处理通常的恶意/劫持服务器..