当使用scapy嗅探数据包时,我可以将它们保存到变量
sniffed = sniff(count=1)
现在,我希望通过
查看数据包中的内容print sniffed
或
print str(sniffed)
但是所有这些让我感觉如下:
������0� E4h@@����������� l��
这不是我需要的。那么如何将嗅探数据包转换为人类可读的二进制数据,或者字节数组或更有用的数据,以便我可以看到里面的内容?我已经尝试使用struct.unpack(format, packet)
这样的格式"!B"
,但这似乎不是正确的解决方案,因为数据包可能长于一个字节或一个短或一个。
我正在尝试的例子
>>> 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
答案 0 :(得分:1)
您可能正在搜索字符串编码输出的scapy Hexdump(pkt) or hexraw(pkt)或repr(str(pkt))
。请注意,sniff返回一个列表,而不是单个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))
答案 1 :(得分:0)
如果您已经以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()