我正在尝试创建自己的嗅探器(仅用于乐趣),我在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上运行它,它不起作用,它不会捕获任何数据包。
你们有人可以帮忙吗?提前谢谢!
答案 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