【问题标题】:Code to analyze pcap file分析 pcap 文件的代码
【发布时间】:2012-04-29 17:57:45
【问题描述】:

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

【问题讨论】:

  • 您可能想看看Bro 强大的网络脚本语言。它是“用于网络分析的 Python/Ruby”。具体来说,您可以编写一个脚本来挂钩new_packet event 以获取您提到的数字。

标签: c++ shell wireshark pcap


【解决方案1】:

UmNyobe,

如果您还没有听说过 Scapy,我相信您正在尝试做的事情将是近乎完美的选择。例如,我编写了这个小 sn-p 来解析 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 解析的领域..

我希望这会有所帮助!

直流

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 使用该规范处理转储的最简单方法是使用 libpcap 读取它 - 使用 pcap_open_offline() 打开它。在大多数情况下,编写自己的代码来处理它是浪费时间;使用 libpcap 还意味着,使用较新版本的 libpcap,也可以读取许多 pcap-ng 文件。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 2014-08-27
      • 2014-04-09
      • 1970-01-01
      • 2016-11-15
      • 2016-04-07
      • 2016-04-07
      • 2015-01-14
      相关资源
      最近更新 更多