5

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

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

4

3 回答 3

1

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

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

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

于 2013-02-23T23:59:38.170 回答
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.
于 2013-02-23T12:37:30.587 回答
0

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

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

问候, 阿南德·乔贝

于 2013-06-13T11:55:40.083 回答