具有pcap分段故障的包嗅探

nc1teljy  于 2023-04-11  发布在  其他
关注(0)|答案(2)|浏览(142)

我试图用C语言编写一个包嗅探程序,当我在成功编译后运行程序时,我遇到了一个分段错误。我试图通过注解掉一些代码并重新编译程序,然后重新运行较小版本的程序来确定导致程序分段错误的确切代码行。下面是我的代码。

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
   printf("Got a packet\n");
}

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;
}

在注解掉代码并重新编译程序并重新运行程序之后,我发现segfault发生在pcap_compile行:

pcap_compile(handle, &fp, filter_exp, 0, net);

当我编译并运行一个程序时,handle(步骤1)行之后的所有内容都被注解掉了,程序运行时没有segfaulting,什么也没有发生。只要我在程序中包含pcap_compile语句,使其成为活动语句,程序就会segfaults。有人知道问题所在吗,是pcap_compile调用还是其他什么?

zbsbpyhn

zbsbpyhn1#

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: %s\n", errbuf);
    exit(1);
}

如果它失败并返回一个空指针,那么如果将空指针作为第一个参数传递给pcap_compile(),那么pcap_compile()和其他libpcap例程将崩溃。
如果注解掉对pcap_open_live()的调用,那么handle不会被设置为任何值,因此它包含一个未知值。* 如果 * 该值 * 碰巧 * 指向内存中的一个位置,使得 * 如果 * pcap_compile()pcap_setfilter()pcap_loop()没有发生崩溃,* 那么 * 它将 * 看起来 * 程序正在工作-但实际上并没有。
所以你应该检查pcap_open_live()是否成功,就像上面的例子一样- * 和 * 你应该检查pcap_compile()pcap_setfilter()pcap_loop()是否也成功。

j9per5c4

j9per5c42#

需要提醒的是,您调用的函数pcap_open_live的第一个参数是您的Linux的网络接口,所以您必须确保您的Linux有名为eth3的网络接口,您可以通过ifconfig -a命令检查您的Linux的网络接口,如果您发现没有名为eth3的接口,那么问题可能就出在这里。

相关问题