c - 在监控模式下注册 pcap 处理程序

标签 c linux network-programming

我想在处于监控模式的接口(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/

相关文章:

c - 68000,可移植JIT库

java - 为什么java的RandomAccessFile在linux上不返回?

c - 将 mprotect 系统调用注入(inject)跟踪进程失败并出现 EFAULT

python - 仅允许来自自定义客户端的连接

c++ - Boost ASIO 异步接受器不打开监听端口

在 C 中仅将文件的一部分复制到新文件

c - 使用 3 个信号量的多个生产者和消费者

C 字符串矩阵

linux - yum 安装在 Fedora 上不工作

c++ - 如何通过代理将套接字连接到http服务器?