在C中的Mac OS X上使用libpcap的嗅探器

时间:2013-02-23 10:37:48

标签: c pcap packet-sniffers

我正在尝试创建自己的嗅探器(仅用于乐趣),我在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上运行它,它不起作用,它不会捕获任何数据包。

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

3 个答案:

答案 0 :(得分:1)

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

如果您在pcap_open_live中遇到“致命错误”,那么可能也会出现权限问题,但您几乎肯定不会因为权限而导致错误,因为{{ 1}}已经失败了。

如果您收到“致命错误”错误消息,则问题可能正如Petesh所说,您指定0作为超时。如果将0指定为超时,pcap_lookupdev()pcap_loop()pcap_dispatch()pcap_next()可以在向应用程序提供数据包之前无限期地等待;在某些平台上,例如Linux和Solaris,它不会无限期地等待,但在其他平台上,例如* BSD和OS X,它可以无限期地等待。尝试超时1000,这是一秒;例如,tcpdump就是这样做的。

答案 1 :(得分:0)

除了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.

答案 2 :(得分:0)

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

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

此致 Anand Choubey