【问题标题】:Get TCP Flags with Scapy使用 Scapy 获取 TCP 标志
【发布时间】:2013-12-24 03:29:05
【问题描述】:

我正在解析一个 PCAP 文件,我需要提取 TCP 标志(SYN、ACK、PSH、URG...)。 我正在使用packet['TCP'].flags 值一次获取所有标志。

pkts = PcapReader(infile)
for p in pkts:
        F = bin(p['TCP'].flags)
        print F, bin(F), p.summary()
        # manual flags extraction from F

有没有办法在不从packet['TCP'].flags 值中手动提取单个 TCP 标志的情况下获得它?

【问题讨论】:

  • 定义更智能的方式?你是如何手动完成的?
  • 所以您是说上述方法有效?代码有什么问题?

标签: python tcp packet packet-capture scapy


【解决方案1】:

通常,处理 FLAGS 的常用方法是使用位图和位运算符。如果您的 Packet 类没有测试标志的特定方法,恕我直言,您可以做的最好的事情是:

FIN = 0x01
SYN = 0x02
RST = 0x04
PSH = 0x08
ACK = 0x10
URG = 0x20
ECE = 0x40
CWR = 0x80

并像这样测试它们:

F = p['TCP'].flags    # this should give you an integer
if F & FIN:
    # FIN flag activated
if F & SYN:
    # SYN flag activated
# rest of the flags here

遗憾的是,python 没有 switch 语句来使它更优雅,但这并不重要。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您可以使用Packet.sprintf() 方法:

    >>> p = IP()/TCP(flags=18)
    >>> p.sprintf('%TCP.flags%')
    'SA'
    

    如果您想要“长”名称,请使用 dict 而不是长 if...elif... 表达式(dict 通常在 Python 中使用,而您将使用 @987654327 @ 其他语言):

    >>> flags = {
        'F': 'FIN',
        'S': 'SYN',
        'R': 'RST',
        'P': 'PSH',
        'A': 'ACK',
        'U': 'URG',
        'E': 'ECE',
        'C': 'CWR',
    }
    >>> [flags[x] for x in p.sprintf('%TCP.flags%')]
    ['SYN', 'ACK']
    

    【讨论】:

      【解决方案3】:

      这也有效。

      if packet[TCP].flags.F:
          print('FIN received')
      

      【讨论】:

      【解决方案4】:

      另外一个选项,记录在案,在提出这个问题时还不存在。它适用于当前的 Scapy 开发版本(包含此更改的第一个版本将是 2.4.0;2.4.0rc* 也包含它)。

      您现在可以在标志值上使用str()

      >>> p = IP()/TCP(flags=18)
      >>> p[TCP].flags
      <Flag 18 (SA)>
      >>> str(p[TCP].flags)
      'SA'
      

      【讨论】:

        猜你喜欢
        • 2016-11-04
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-14
        • 2022-01-21
        • 2012-04-13
        相关资源
        最近更新 更多