【发布时间】: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