【问题标题】:Sniffer with libpcap on Mac OS X in C用 C 语言在 Mac OS X 上使用 libpcap 进行嗅探器
【发布时间】:2013-02-08 23:28:38
【问题描述】:

我正在尝试创建自己的嗅探器(仅供娱乐),我在 Mac 上工作。 我正在使用 libpcap,这是一个非常好的嗅探库。所以,我使用了这个简单的嗅探器,它嗅探了 5 个数据包:(它是用 C 编写的)

#include <pcap.h>
#include "hacking.h"

void pcap_fatal(const char *failed_in, const char *errbuf) {
     printf("Fatal Error in %s: %s\n", failed_in, errbuf);
     exit(1);
}

int main() {
    struct pcap_pkthdr header;
    const u_char *packet;
    char errbuf[PCAP_ERRBUF_SIZE];
    char *device;
    pcap_t *pcap_handle;
    int i;

device = pcap_lookupdev(errbuf);
if(device == NULL)
    pcap_fatal("pcap_lookupdev", errbuf);

printf("Sniffing on device %s\n", device);

pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);
if(pcap_handle == NULL)
    pcap_fatal("pcap_open_live", errbuf);

for(i=0; i < 5; i++) {
    packet = pcap_next(pcap_handle, &header);
    printf("Got a %d byte packet\n", header.len);
    dump(packet, header.len);
}

pcap_close(pcap_handle);

}

如果您想知道,是的,我从一本书(黑客:剥削的艺术)中摘录并稍作修改。问题是,如果我在 Linux 上运行它,它可以完美运行,没有问题。但如果我在 Mac 上运行它,它就不起作用,也不会捕获任何数据包。

你们有人可以帮忙吗?提前致谢!

【问题讨论】:

  • 它是否打印任何错误消息?您确定您在正确的网络设备上收听吗?
  • 是的,我确定。它会嗅探“en0”,这是正确的设备。
  • 你无权访问 /dev/bpf*,它是 Mac OS X 上的嗅探设备。在 sudo 下运行它,它可能对你有用。
  • 另一个问题是 pcap_open_live 有一个后备缓冲区,pcap_next 可能在缓冲区被填满之前不会返回。读取时应使用非零超时(例如 1000),并检查是否返回数据包。
  • 我在某些 Mac 上使用我的程序(它也使用 pcap_setfilter,以 sudo 开头)看到了同样的奇怪行为。在两台 Mac 上,我的程序运行良好,在另外两台(也是最新的操作系统,也安装了所有更新)上,我没有收到任何数据包。相同的代码,不同的行为。更奇怪的是:如果我并行运行 tcpdump,那么 tcdump 会转储数据包,而我的程序开始接收数据包。

标签: c pcap packet-sniffers


【解决方案1】:

除了Petesh:详情请查看手册页(终端中的“man pcap”)。

它说:

在 BSD 下(包括 Mac OS X):

          You must have read access to /dev/bpf* on systems that don't have a cloning
          BPF device, or to /dev/bpf on systems that do.  On BSDs with a devfs  (this
          includes  Mac OS X), this might involve more than just having somebody with
          super-user access setting the ownership or permissions on the BPF devices -
          it  might  involve  configuring  devfs  to set the ownership or permissions
          every time the system is booted, if the system even supports  that;  if  it
          doesn't  support  that,  you might have to find some other way to make that
          happen at boot time.

【讨论】:

  • 你应该添加一个关于“读取超时”的注释——他可能也遇到了这个问题。
  • 实际上, 应该添加该注释 - 如果您要回答他的问题(您的 cmets 回答了),您应该在回答中这样做,而不是在评论中这样做。
【解决方案2】:

如果您收到“pcap_lookupdev 中的致命错误”错误消息,那么问题出在 Sascha 所说的 - 您没有捕获数据包的权限。 如果您收到该消息,请尝试使用 sudo 运行程序,或者尝试将 /dev/bpf* 设备的所有权更改为您(您需要这样做)与sudo)。但是,您是说“它在 'en0' 上嗅探”,所以大概是因为它正在打印“在设备 en0 上嗅探”,在这种情况下 pcap_lookupdev() 并没有失败。

如果您收到“pcap_open_live 中的致命错误”,可能也是权限问题,但您几乎可以肯定不会因为权限问题而收到错误,如 @987654324 @ 已经失败了。

如果您没有收到“Fatal Error in”错误消息,那么问题可能是,正如 Petesh 所指出的,您将 0 指定为超时。如果指定超时时间为 0,pcap_loop()pcap_dispatch()pcap_next()pcap_next_ex() 可以无限期等待,然后再向应用程序提供数据包;在某些平台上,例如 Linux 和 Solaris,它不会无限期地等待,但在其他平台上,例如 *BSD 和 OS X,它可以无限期地等待。尝试超时1000,也就是一秒;例如,tcpdump 就是这样做的。

【讨论】:

    【解决方案3】:

    我在 10.8.4 测试代码并将参数 to_ms(读取超时)更改为某个非零值,然后开始接收数据包。

    感谢基本代码。它节省了我的时间。

    问候, 阿南德·乔贝

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 2010-12-10
      • 2013-07-22
      • 1970-01-01
      • 2011-05-13
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多