我有一个功能,可以使用 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
以我的热门评论开头......
从
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