读取保存文件

时间:2018-06-16 01:45:27

标签: c linux wireshark pcap libpcap

从pcap文件获取传入数据包。我在pcap_compile()中设置了“入站”过滤器,这里是部分代码。

  pcap = pcap_open_offline("test.pcap", errbuf);
  if (pcap == NULL)
  {
    fprintf(stderr, "error reading pcap file: %s\n", errbuf);
    exit(1);
  }

  char filter_exp[] = "inbound";
  struct bpf_program pgm;
  if (pcap_compile(pcap, &pgm, filter_exp, 0, PCAP_NETMASK_UNKNOWN) == -1) {
    printf("Bad filter - %s\n", pcap_geterr(pcap));
    return 1;
  }

  if (pcap_setfilter(pcap, &pgm) == -1) {
    printf("Error setting filter - %s\n", pcap_geterr(pcap));
    return 1;
  }

但这是错误信息。

  

错误的过滤器 - 读取保存文件时,linktype 1上不支持入站/出站

我只是用Google搜索并找到了可能的解决方案。

How to filter the inbound packet by libpcap in C:

  

“入站”过滤器不适用于以太网链接类型(煮熟的捕获将具有它,例如。)。您的需求是否足以过滤目标MAC或IP地址?

How to determine packet direction using libpcap:

  

源或目标IP地址就足够了。如果源是本地的,则它是出站的。如果目标是本地目标,则它是入站目标。如果不是,那就是混杂的嗅觉。

看起来唯一的方法是确定数据包的目标IP地址是否为本地IP地址。但是如何从pcap文件中了解本地IP地址?

1 个答案:

答案 0 :(得分:0)

Barmar是正确的,因为您无法确定IP地址是否仅来自您的pcap文件。但是,如果您知道pcap 未在混杂界面上捕获,您可以尝试猜测界面的地址

您可以猜测IP或以太网地址。以太网地址可能是最好的,因为您的pcap文件中可能没有IP数据包。然而,可能不太清楚哪个以太网地址是您的接口,因为网关的地址也将包含大量数据包。

猜测接口的以太网地址

$ tshark -r tmp.pcap -T fields -e eth.src -e eth.dst | grep -Po "(\w{2}:){5}\w{2}" | sort | uniq -c
     11 01:00:5e:00:00:01
     41 01:00:5e:00:00:fb
     11 01:00:5e:00:00:fc
     27 01:00:5e:7f:ff:fa
     34 00:00:00:00:00:01
     31 00:00:00:00:00:fb
  11815 00:00:d9:97:5b:37
    905 00:00:eb:12:48:d6
  11115 00:00:b0:7b:ce:08
     80 ff:ff:ff:ff:ff:ff

显示每个以太网地址及其包含的数据包数(作为源或目标)。具有最大数据包数量的以太网地址可能您的接口。第二大的是可能网关。

接口地址为目的地的数据包是入站数据包,反之亦然。

猜测接口的IP地址

tshark -r tmp.pcap -T fields -e ip.src -e ip.dst ip | grep -Po "(\d+.){3}\d+" | sort | uniq -c

这里的原理相同,您应该看到一个包含大量数据包的IP地址。那可能你的界面。