用于分析 pcap 文件的代码

Code to analyze pcap file

本文关键字:代码 文件 pcap 用于      更新时间:2023-10-16

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

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 outputn
   Usage:n
   python cap2netflow.py <[ pcap filename or -l ]>n
   -l is live capture switchn
   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++这对您来说已经很有意义了。

在这里得到斯卡皮

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

此页面上有大量指向有用教程的链接,请记住,Scapy 做得更多,但专注于讨论 pcap 解析的领域。

我希望这有帮助!

直流

我在一个库上工作来分析 tcp 转储,但它是为了一项业务,所以我不能只给你。 如果您没有找到所需的内容,那么我的答案会有所帮助。tcpdump 只是嵌套的网络数据,如 Matryoshka 娃娃,其中 pcap 层由 tcpdump 添加。

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

如果您必须更深入地分析,这些是以下层,按顺序排列

  1. 链接层
  2. 互联网层
  3. 传输层
  4. 应用层

每个层都有一个标头定义。因此,您需要查找 pcap 数据包含的协议堆栈,并解析标头以获取信息。

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

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