【问题标题】:Socket/Interface filter Ioctl callback not getting called未调用套接字/接口过滤器 Ioctl 回调
【发布时间】:2018-02-13 08:09:57
【问题描述】:

我有一个小的 C 程序,它执行以下操作:

 int fd;
 fd = socket(AF_INET, SOCK_STREAM, 0);

 ioctl(fd, ..., ...);

 close(fd);

我的 kext ioctl 回调如下所示:

errno_t
Router::Ioctl(void *cookie, socket_t so, unsigned long request, const char* argp)
{
    IOLog("-- SOCK IOCTL Request is %lu\n", request);
    return KERN_SUCCESS;
}

当我在 Safari 和其他东西中打开网页时,我可以在控制台应用程序中看到输出

默认 16:09:08.557920 +0200 内核 -- IOCTL 请求为 2147772030

但是当我执行我的 C 程序时,它似乎“跳过”了我的 kext 并且没有打印任何内容。

关于为什么会发生这种情况的想法?

编辑

为了它,我也尝试使用接口过滤器做同样的事情 - 结果相同

【问题讨论】:

    标签: macos networking kernel kernel-extension


    【解决方案1】:

    这不是一个决定性的答案,因为您的示例代码非常模糊和不完整。一些可能有助于诊断的建议和额外信息:

    1. 您的sflt_register() 电话是什么样的?您的套接字是数据报 (UDP) 套接字,但 Safari 可能正在使用流 (TCP) 套接字。套接字过滤器适用于一种类型的套接字。

    2. ioctl 在您的测试程序中执行什么操作? (您知道不支持套接字上的自定义 ioctl 吗?)

    3. 您是否在过滤器中看到其他(非 ioctl)套接字事件?

    4. 您对接口过滤器有什么期望?到套接字的 Ioctl 不会传播到接口。

    5. 最后,请注意 NKE 已被有效弃用。如果您在接下来的几个 macOS 版本中可能需要 NKE 功能,则需要与 Apple 联系。 (雷达增强请求和/或 DTS)

    【讨论】:

    • 感谢您的回答。弃用是指我根本无法加载它们?
    • @Shai Apple 在 WWDC 2017 Session 707 宣布他们计划最终移除 NKE。 (一般来说,从长远来看,他们似乎正试图完全删除第三方内核访问。)我认为 KPI 在接下来的 2-3 个左右的主要 macOS 版本中不会消失(注意:我没有内部信息) ,所以如果别无选择,在这些 KPI 上构建软件仍然是可以的。但是,您应该通知 Apple 您如何在产品中使用它们,因为您需要它们在 NKE 消失之前提供替代方案。
    • 据我所知,NE 不包括 NKE 所具有的套接字过滤器功能。我的 NKE 执行绑定/连接操作 - NE 甚至可以吗?
    • 不,据我所知,目前在用户空间中是不可能的。这正是 Apple 想要听到的——您使用 NKE 做什么,以及您需要从用户空间替换中获得什么样的功能。 (我建议您观看视频或阅读成绩单。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2012-08-20
    • 2016-07-02
    • 2010-09-22
    相关资源
    最近更新 更多