libpcap 禁用监控模式(C、macOS)

问题描述 投票:0回答:1

我有一个功能,可以使用 libpcap 在 macOS 上启用 WiFi 设备的监控模式。这可行,但目前将 WiFi 设备设置回托管模式的唯一方法是退出该进程。我想将 WiFi 设备设置为托管模式,同时允许该过程继续。据我所知,这不能用 libpcap 来完成。如何将 WiFi 设备设置回托管模式(可能使用 Objective-C 中的 CoreWLAN API?)?

pcap_t *enable_monitor(char *dev) {
    wifi_disassociate();

    char error_buffer[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    int result;

    handle = pcap_create(dev, error_buffer);
    if (handle == NULL) {
        printf("failed to create a handle: %s\n",
               error_buffer);
        return NULL;
    }
    result = pcap_set_rfmon(handle, 1);
    if (result != 0) {
        printf("failed to set pcap rfmon: %s (%s)\n",
               pcap_statustostr(result),
               pcap_geterr(handle));
        return NULL;
    }
    result = pcap_activate(handle);
    if (result != 0) {
        printf("failed to activate handle: %s (%s)\n",
               pcap_statustostr(result),
               pcap_geterr(handle));
        return NULL;
    }
    //pcap_close(handle);
    return handle;
}

编辑: 将第二个参数

cap_set_rfmon
设置为 0 似乎不会将设备设置为托管模式,它只是不会将其设置为监视模式。

int disable_monitor(pcap_t *handle) {
    int result;
    result = pcap_set_rfmon(handle, 0);
    if (result != 0) {
        printf("failed to set pcap rfmon: %s (%s)\n",
               pcap_statustostr(result),
               pcap_geterr(handle));
        return 1;
    }
    pcap_close(handle);
    return 0;
}

int main() {
    char *dev = find_wifi_device();
    pcap_t *handle = enable_monitor(dev);
    sleep(5);
    int status = disable_monitor(handle);
    printf("Status: %d\n", status);
    for (;;)
        sleep(100);
}

这会导致:

failed to set pcap rfmon: The setting can't be changed after the pcap_t is activated (can't perform  operation on activated capture)
Status: 1
c objective-c macos libpcap
1个回答
0
投票

以我的热门评论开头......

man pcap_set_rfmon
设置模式。但是,它仅在“激活时”生效(即
pcap_activate
)。

此外,如果在已经激活的句柄上调用,则调用将返回

PCAP_ERROR_ACTIVATED
错误。

我查看了

libpcap
源代码并且......

一旦连接被激活,我可以找到 no

pcap_*
调用来“停用”它。因此,我们可能必须关闭句柄并打开一个新实例。

此外,AFAICT,使用 0 执行

pcap_set_rfmon
会清除标志(例如
pcap->opt.rfmon
)。但是,对于一个新实例(即 before 调用
pcap_activate
),这应该已经很清楚了,所以这是一个有效的无操作。

从第一次 pcap_activate 调用起,

界面
就已经处于给定模式。一般来说,如果我们调用
pcap_close
,它不会“重置”(注意: 对于 some 接口,接口 will 会被标记为在
pcap_close
时重置,但我们通常不能依赖于此).

默认模式是什么?我猜测是混杂模式,因此要重置监视器模式,我们可能必须使用

pcap_set_promisc
来代替。

这有效。谢谢。

pcap_set_promisc
无需第二个
pcap_set_rfmon
即可工作。 – 本杰明·米克勒

© www.soinside.com 2019 - 2024. All rights reserved.