c - 在 C 语言的 Mac OS X 上使用 libpcap 进行嗅探

标签 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 上运行它,它就无法工作,也不会捕获任何数据包。

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

最佳答案

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

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

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

关于c - 在 C 语言的 Mac OS X 上使用 libpcap 进行嗅探,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15039551/

相关文章:

c - 本地主机上的 OSI 层

c - 为什么我的代码不能用 libpcap 编译?

asp.net - 如何嗅探http请求

windows - 在 Windows XP、SP3 上使用 RawCap 嗅探本地主机

c - BeagleBone 黑色 : UART crashes the BBB after two successful read write calls

将文件名连接到目录名

c - 需要图路径抽象算法

c - 通过 TCP 的字符串长度

pcap - 如何读取 pcap 文件,按 IP 地址和端口过滤,然后将数据写入另一个文件

Python - scapy 超时选项根本不起作用