将嗅探到的 scapy 数据包转换为字节

Converting a sniffed scapy packet to bytes

当用 scapy 嗅探数据包时,我可以将它们保存到一个变量中

sniffed = sniff(count=1)

现在我想通过

查看数据包中的内容
print sniffed

print str(sniffed)

但这一切给我的是如下内容:

������0�    E4h@@����������� l��

这不是我需要的。那么如何将嗅探到的数据包转换为人类可读的二进制文件、字节数组或更有用的东西,以便我可以看到里面有什么?我已经尝试过将 struct.unpack(format, packet)"!B" 等格式一起使用,但这似乎不是正确的解决方案,因为数据包可以长于一个字节、一个短整型或一个 Int。


我正在尝试的例子

>>> packet = sniff(count=1)[0]
>>> hexdump(packet)
0000   00 50 56 8E 00 0D 14 CC  20 16 E7 59 08 00 45 00   .PV..... ..Y..E.
0010   00 34 6B AB 40 00 40 06  C6 48 AC 11 8A E2 68 10   .4k.@.@..H....h.
0020   69 CC B5 47 00 50 E9 85  17 B0 BA EF 29 B2 80 10   i..G.P......)...
0030   01 DD 8D 58 00 00 01 01  08 0A 00 0E A2 C0 03 5D   ...X...........]
0040   9D 1C 
>>> packetByteArray = bytearray(repr(str(packet)))
>>> hex(packetByteArray[0])
'0x27'
>>>

但在 hexdump 中我可以看到第一个字节实际上是 0x00 而不是 0x27

您可能正在搜索 scapy Hexdump(pkt) or hexraw(pkt)repr(str(pkt)) 以获取字符串编码输出。请注意,嗅探 returns 一个列表,而不是单个 pkt。

如果您想逐个访问序列化的数据包字节,只需序列化层 str(pkt) 以获得 python (char/byte)-string。

for b in str(pkt):
    print "char: %s ord/value: %d hex: %x"%(b,ord(b),ord(b))

如果您已经将数据包读取为 pkt,您可能会按时间查看字节数:

pktBytes=[]
pktTimes=[]
from datetime import datetime
#Read each packet and append to the lists.
for p in pkt:
    if IP in p:
        try:
            pktBytes.append(p[IP].len)
            pktTime=datetime.fromtimestamp(p.time)
            pktTimes.append(pktTime.strftime("%Y-%m-%d %H:%M:%S.%f"))
        except:
            pass

# Convert list to series
bytes = pd.Series(pktBytes).astype(int)

# Convert the timestamp list to a pd date_time with the option “errors=coerce” to handle errors.
times = pd.to_datetime(pd.Series(pktTimes).astype(str),  errors='coerce')

# Build the dataframe, set time as index
df  = pd.DataFrame({'Bytes': bytes, 'Times':times})
df = df.set_index('Times')

# See how it looks in 2 seconds sums
df.resample('2S').sum().plot()