使用 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,而且似乎必须有一种更简单的方法来做到这一点
您使用
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)
主要变更和简化:
使用 isinstance 进行层检查:使用
layer.name
来确定层是否为 ICMP 层,而不是检查 isinstance(layer, ICMP)
。这是一种更 Pythonic 且可靠的方法。
直接迭代层:直接迭代
pkt
,这允许您遍历其所有层,而无需显式提取它们。
简化序列比较:使用Python的
max
函数更新finalSeq。这样就无需手动比较每个 seq
值并跟踪最高值。
删除冗余循环:原始代码有两个循环,一个就足够了。更新版本通过将功能合并到单个循环中来简化此操作。
确保
pkt
是一个 Scapy 数据包对象并包含 ICMP 层,以便该脚本按预期工作。