用于分析pcap文件的代码

时间:2012-04-18 10:21:44

标签: c++ shell wireshark pcap

我正在尝试分析包含使用tcpdump捕获的数据包的文件。我首先想要使用5元组将数据包分类为流。然后我需要获得每个流中每个数据包的大小和到达间隔时间。我在wireshark中尝试了Conversation列表,但它只给出了流中的数据包数量,而不是流中每个数据包的信息。对可以完成这项工作的任何代码(c ++或shell脚本)的建议?谢谢

3 个答案:

答案 0 :(得分:2)

UmNyobe,

如果你还没有听说过Scapy,但我相信你想要做的事情几乎是完美的。例如,我写了这个小片段来解析一个pcap字段并给我一些你正在谈论使用Scapy的东西。

#!/usr/bin/python -tt

from scapy import *
import sys
from datetime import datetime

'''Parse PCAP files into easy to read NETFLOW like output\n
   Usage:\n
   python cap2netflow.py <[ pcap filename or -l ]>\n
   -l is live capture switch\n
   ICMP packets print as source ip, type --> dest ip, code'''


def parse_netflow(pkt):  
    # grabs 'netflow-esqe' fields from packets in a PCAP file
    try:
        type = pkt.getlayer(IP).proto
    except:
        pass

    snifftime = datetime.fromtimestamp(pkt.time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[1]

    if type == 6:
        type = 'TCP'
    if type == 17:
        type = 'UDP'
    if type == 1:
        type = 'ICMP'

    if type == 'TCP' or type == 'UDP':
        print( ' '.join([snifftime, type.rjust(4, ' '), str(pkt.getlayer(IP).src).rjust(15, ' ') , str(pkt.getlayer(type).sport).rjust(5, ' ') , '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' ') , str(pkt.getlayer(type).dport).rjust(5, ' ')]))

    elif type == 'ICMP':
        print(' '.join([snifftime, 'ICMP'.rjust(4, ' '),  str(pkt.getlayer(IP).src).rjust(15, ' ') , ('t: '+ str(pkt.getlayer(ICMP).type)).rjust(5, ' '), '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' '), ('c: ' + str(pkt.getlayer(ICMP).code)).rjust(5, ' ')]))

    else:
        pass
if '-l' in sys.argv:
    sniff(prn=parse_netflow)
else:
    pkts = rdpcap(sys.argv[1])
    print(' '.join(['Date: ',datetime.fromtimestamp(pkts[0].time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[0]]))
    for pkt in pkts:
        parse_netflow(pkt)

安装Python和Scapy然后使用它来帮助您入门。如果您需要任何帮助,请告诉我,如果您知道C ++的机会,那么这对您来说已经很有意义了。

在这里获取Scapy

http://www.secdev.org/projects/scapy/

这个页面上有大量的链接提供有用的教程,请记住,Scapy在谈论pcap解析的领域时会做更多的事情但是很有用。

我希望这有帮助!

直流

答案 1 :(得分:1)

我在一个库上工作来分析tcp转储,但这是为了一个企业,所以我不能只给你。如果你找不到你想要的东西那么我的答案可以帮助你。 tcpdump只是嵌套的网络数据,如Matryoshka dolls,其中pcap层由tcpdump添加。

如果您只想处理捕获,则转储的格式在Libpcap File Format中指定。要获得每个数据包的大小和到达时间,您需要使用此规范处理转储。

如果您需要深入分析,则按顺序执行以下各层

  1. 链接层
  2. 互联网层
  3. 传输层
  4. 应用程序层
  5. 每个图层都有一个标题定义。因此,您需要找到pcap数据包含的协议栈,并解析标头以获取信息。

答案 2 :(得分:0)

5元组的成员是什么?如果流是TCP或UDP,则源和目标IP地址和端口号,以及可能用于区分两个端点之间的多个流量的数字将起作用;对于SCTP,它会类似,但如果流是流,则可能需要更多。

如果5-tuple的成员都是Wireshark中的“命名字段”,则可以使用带有-T fields选项的TShark,并使用-e选项指定要打印的字段,以及选择一个带有时间戳的字段(frame.time_epoch将为您提供自UN * X纪元以来的秒和时间分数),一个适当大小的字段(frame.len为您提供原始数字链路层数据包中的字节 PLUS 任何元数据,例如802.11无线电信息的radiotap头),以及其他字段,然后将TShark的输出提供给执行该操作的脚本或程序处理你想做的事。这使得TShark可以处理协议层,因此您的程序只需要处理结果数据。