我正在尝试用 C 编写数据包嗅探程序,并且在成功编译后尝试运行该程序时遇到分段错误。 我试图通过注释掉一些代码并重新编译程序,然后重新运行我的程序的较小版本来确定导致程序段错误的确切代码行。 这是我的代码。
void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
printf("Got a packetn");
}
int main()
{
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
char filter_exp[] = "ip proto icmp";
bpf_u_int32 net;
// Step 1: Open live pcap session on NIC with name eth3
handle = pcap_open_live("eth3", BUFSIZ, 1, 1000, errbuf);
// Step 2: Compile filter_exp into BPF psuedo-code
pcap_compile(handle, &fp, filter_exp, 0, net);
pcap_setfilter(handle, &fp);
// Step 3: Capture packets
pcap_loop(handle, -1, got_packet, NULL);
pcap_close(handle); //Close the handle
return 0;
}
注释掉代码并重新编译程序并重新运行程序后,我发现段错误发生在pcap_compile
行:
pcap_compile(handle, &fp, filter_exp, 0, net);
当我编译并运行一个程序时,handle
(步骤 1(行注释掉后的所有内容,程序运行时没有段错误,没有任何反应。 一旦我通过在程序中激活pcap_compile
语句来包含该语句,程序就会出现段错误。 有谁知道可能是什么问题,无论是pcap_compile
电话还是其他问题?
Steffen Ullrich在这里是100%正确的。
如果要调用任何返回pcap_t *
的例程,例如pcap_open_live()
,则必须通过检查它是否返回空指针来检查以确保它成功:
handle = pcap_open_live("eth3", BUFSIZ, 1, 1000, errbuf);
if (handle != NULL) {
fprintf(stderr, "Can't open eth3: %sn", errbuf);
exit(1);
}
如果它失败并返回空指针,那么pcap_compile()
- 和其他 libpcap 例程 - 如果您将该空指针作为第一个参数传递给它,它将崩溃。
如果注释掉对pcap_open_live()
的调用,则handle
不会设置为任何内容,因此它包含一个未知值。如果该值恰好指向内存中的某个位置,如果pcap_compile()
、pcap_setfilter()
和pcap_loop()
没有崩溃,那么它看起来好像程序正在工作 - 但事实并非如此。
所以你应该检查pcap_open_live()
是否成功,如上例所示 - 你应该检查pcap_compile()
、pcap_setfilter()
和pcap_loop()
是否成功。
我想提醒一下,你调用pcap_open_live
函数的第一个参数是你的Linux的网络接口。因此,您必须确保您的 Linux 具有名为eth3的网络接口。您可以通过ifconfig -a
命令检查 Linux 的网络接口,如果您发现不存在名为eth3的接口,那么这可能是问题的来源。
当我尝试运行杜文亮的 SEED 实验室代码进行嗅探和欺骗时,我也遇到了分段错误。但是当与sudo
一起运行时它运行良好.这里的评论中提到,如果没有sudo
它就不会运行,因为它没有接口的权利。也许你有同样的问题。