【问题标题】:Converting a sniffed scapy packet to bytes将嗅探到的 scapy 数据包转换为字节
【发布时间】:2016-04-19 21:31:21
【问题描述】:

当使用 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

【问题讨论】:

    标签: struct packet scapy unpack


    【解决方案1】:

    如果您已经将数据包读取为 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()
    

    【讨论】:

      【解决方案2】:

      您可能正在搜索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))
      

      【讨论】:

      • hexdump 给了我我需要的东西,但我怎样才能轻松访问数据包字节?喜欢firstByteOfPacket = packet[0]?。我目前正在尝试通过packetByteArray = bytearray(repr(str(packet))) 执行此操作,然后firstByteOfPacket = packetByteArray[0] 期望接收数据包的第一个字节。然而,这给了我一些显然不是第一个字节的东西,正如我从hexdump 中看到的那样。我将在我的问题中添加一个示例。
      • 查看更新的答案。只需序列化层/数据包并以str(pkt)[1] 访问任何字节以获取ascii char 或ord(str(pkt)[1]) 以获取值。其他一切都只是代表问题。
      • 是的,这正是我所需要的。
      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 2015-04-02
      • 2021-06-03
      • 2023-01-26
      • 2015-04-24
      • 1970-01-01
      • 2015-04-09
      • 2013-09-11
      相关资源
      最近更新 更多