我想在处于监控模式的接口(interface)上创建一个 pcap
处理程序。界面是用linux中的iw
工具生成的。为此,我使用 popen
void registerWIMonitor(const char *deviceName) {
char cmd [1000] = {0x0};
sprintf(cmd, "iw phy phy0 interface add %s type monitor", deviceName);
FILE* fp = popen(cmd, "w");
if (fp == NULL) {
throwErrorScreen(strerror(errno), REGISTERWIMONITOR);
}
pclose(fp);
}
然后我在该监视器 deviceName
上注册处理程序。
void pcapPrepareHandler(const char *deviceName) {
char errorBuffer[PCAP_ERRBUF_SIZE];
if (!(handler = pcap_create(deviceName, errorBuffer))) {
throwErrorScreen(errorBuffer, PCAP_CREATE);
}
if ((pcap_set_snaplen(handler, SNAPLEN)) < 0) {
throwErrorScreen(pcap_geterr(handler), PCAP_HANDLER_SET_SNAPLEN);
}
if ((pcap_set_promisc(handler, PROMISC)) < 0) {
throwErrorScreen(pcap_geterr(handler), PCAP_HANDLER_SET_PROMISC);
}
if ((pcap_set_timeout(handler, TO_MS)) < 0) {
throwErrorScreen(pcap_geterr(handler), PCAP_HANDLER_SET_TIMEOUT);
}
if (!pcap_can_set_rfmon(handler)) {
throwErrorScreen(pcap_geterr(handler), PCAP_HANDLER_SET_TIMEOUT);
}
if ((pcap_activate(handler)) < 0) {
throwErrorScreen(pcap_geterr(handler), PCAP_HANDLER_ACTIVATE);
}
}
但是上面的函数在pcap_activate
上抛出了一个错误。错误缓冲区显示 That device is not up
。
如果我跑
iw wimon0 info
它返回结果:
Interface wimon0
ifindex 16
wdev 0xe
addr 00:26:82:e7:88:82
type monitor
wiphy 0
表明接口(interface)创建成功。 我搜索了更多,当我输入时
ifconfig
它没有返回接口(interface)wimon0
。
如果现在我运行:
ls /sys/class/ieee80211/phy0/device/net
要查看可用设备,它会返回接口(interface) wimon0
。还有:
cat /sys/class/ieee80211/phy0/device/net/moni0/type
返回 803
,这意味着界面真正处于监控模式。
我的想法是它可能没有在系统上正确注册。但我不知道如何正确地做到这一点。我错过了什么吗?
更新
即使我使用 airmon-ng
创建接口(interface),我仍然会收到此错误。
最佳答案
简单回答
运行 ip link set up dev <device>
设置您的设备。
问题
此设备未激活。换句话说,有一个设备,但默认情况下它是禁用的。
为什么?
首先,在Linux中,每一个网络设备都是一个Interface。在我们的例子中,它是一个虚拟接口(interface)。
默认情况下,接口(interface)未标记为 Active / Up
,因为在大多数情况下,激活的设备需要更多资源(例如 ARP
服务、DHCP
服务等)。
关于c - 在监控模式下注册 pcap 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41570095/