使用scapy处理同一类型的多个图层

问题描述 投票:0回答:1

使用 scapy,我试图找到具有多个相同类型层的数据包中特定参数的最高值。 这是与我想做的事情类似的示例:

if ICMP in pkt:
    relevantLayers=0
    finalSeq =0
    allLayersA=pkt.payload.layers()
    for pLayer in allLayersA:
        if (ICMP == pLayer.name) :
            relevantLayers = relevantLayers+1
    for i in range(relevantLayers) :
        if pkt.getlayer(ICMP,i).seq > finalSeq :
            finalSeq = pkt.getlayer(ICMP,i).seq

    print(finalSeq)

我不确定这是否有效,特别是因为我不确定如何使用layer.name,而且似乎必须有一种更简单的方法来做到这一点

python scapy
1个回答
0
投票

您使用

Scapy
在 ICMP 层中查找最高 seq 值的方法是正确的,但是可以对您的代码进行一些改进和简化。这是一个优化版本:

from scapy.all import ICMP

if ICMP in pkt:
    finalSeq = 0
    # Iterate over each layer in the packet
    for layer in pkt:
        # Check if the layer is an ICMP layer
        if isinstance(layer, ICMP):
            # Update finalSeq if this layer's seq is higher
            finalSeq = max(finalSeq, layer.seq)

    print(finalSeq)

主要变更和简化:

  1. 使用 isinstance 进行层检查:使用

    layer.name
    来确定层是否为 ICMP 层,而不是检查
    isinstance(layer, ICMP)
    。这是一种更 Pythonic 且可靠的方法。

  2. 直接迭代层:直接迭代

    pkt
    ,这允许您遍历其所有层,而无需显式提取它们。

  3. 简化序列比较:使用Python的

    max
    函数更新finalSeq。这样就无需手动比较每个
    seq
    值并跟踪最高值。

  4. 删除冗余循环:原始代码有两个循环,一个就足够了。更新版本通过将功能合并到单个循环中来简化此操作。

确保

pkt
是一个 Scapy 数据包对象并包含 ICMP 层,以便该脚本按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.