如何在 Mac 网络内核扩展(套接字过滤器)中识别 C 中的进程?

Posted

技术标签:

【中文标题】如何在 Mac 网络内核扩展(套接字过滤器)中识别 C 中的进程?【英文标题】:How to identify a process in C within a Mac Network Kernel Extension (Socket Filter)? 【发布时间】:2016-06-11 14:04:44 【问题描述】:

我为 Mac OS X 开发了一个网络内核扩展(套接字过滤器),它作为防火墙阻止某些应用程序的网络访问。

这里是 Socket Filter 的简单附加函数(每次应用程序打开 TCP 套接字时):

<!-- language: C -->
static errno_t
filter_attach_fn(void **cookie, socket_t so)

    errno_t                 result = 0;
    char                    name[PATH_MAX];

    *cookie = NULL;

    proc_selfname(name, PATH_MAX);
    printf("Filter attaching to process: %s\n", name);

    if (strcmp(name, "Google Chrome") != 0) result = ENOPOLICY; // don't attach to this socket.

    return result;

现在我正在使用 proc_selfname。假设我想阻止来自 Google Chrome 的所有连接。所以我只是要检查名称 var 是否等于“Google Chrome”,如果是,过滤器将附加。

稍后我想使用套接字控件将应用程序名称动态添加到一种“阻止列表”中。

有没有更好的方法来识别这些应用程序(预计进程名称)?如果我检查“Safari”,这种方法不起作用,因为打开套接字的进程的名称被命名为“com.apple.Webkit”而不是“Safari”。而且我确信其他应用程序还有更多例外情况。

有没有办法知道com.apple.Webkit的“根进程”是Safari?

【问题讨论】:

嗨,我也遇到了类似的问题。你找到解决办法了吗? 没有。我什至和一位苹果工程师谈过,他告诉我没有公开的 API。所以需要大量的黑客攻击。我找不到解决方案。 【参考方案1】:

您可以通过在用户模式下发送进程 ID 来做到这一点。在用户模式下,您可以获得可执行文件的路径。通过使用路径,您可以获得进程的封闭应用程序名称。然后将结果发送回内核。

要在内核中获取进程 ID,您可以使用 proc_selfpid() 函数调用。

【讨论】:

以上是关于如何在 Mac 网络内核扩展(套接字过滤器)中识别 C 中的进程?的主要内容,如果未能解决你的问题,请参考以下文章

为基于AT命令的调制解调器的串行端口开发Mac OSX网络驱动程序

绕过MAC地址认证接入目标网络

在 MAC OS X 10.8.x 上,AppStore 应用程序如何安装内核扩展?

22 URL到网卡:网络数据流动

GCM 如何在推送通知中识别设备?

socket收发消息原理剖析