【问题标题】:How do I get a scapy field as bytes?如何将 scapy 字段作为字节获取?
【发布时间】:2021-07-06 09:31:40
【问题描述】:

我将原始字节转换为如下所示的 scapy Ether 实例:

scapy_packet = Ether(data)

现在我想得到这个帧的源mac地址作为字节。 所以假设源mac地址是01:02:03:04:05:06,我想要和bytes((0x01, 0x02, 0x03, 0x04, 0x05, 0x06))创建的对象一样。

我该怎么办?我觉得应该有一个简单的方法来做到这一点。我显然不想将 mac 地址字符串转换回字节对象,因为我基本上将字节转换为字符串只是为了将其转换回字节。

是的,我知道我可以用原始字节做data[6:12],但我也希望这种方法用于其他的东西,比如位置不固定的 IP 地址。我想从 scapy 获取这个值。

我使用的是 Python 3.9.5。

到目前为止,以下事情没有成功:

bytes(scapy_packet.src) -> TypeError: string argument without an encoding

scapy_packet[Ether].src.__bytes__() -> 'str' 对象没有属性 '__bytes__'

bytes(scapy_packet[Ether].src) -> TypeError: string argument without an encoding

scapy_packet.src.__bytes__() -> 'str' 对象没有属性 '__bytes__'

bytes(scapy_packet.get_field("src")) -> TypeError: cannot convert 'SourceMACField' object to bytes

scapy_packet.get_field("src").__bytes__() -> AttributeError: 'SourceMACField' 对象没有属性 '__bytes__'

【问题讨论】:

    标签: python scapy


    【解决方案1】:

    你可以这样使用:(doc)

    def get_field_bytes(pkt, name):
         fld, val = pkt.getfield_and_val(name)
         return fld.i2m(pkt, val)
    

    演示:

    >>> a = Ether(src="aa:aa:aa:aa:aa:aa")/IP(dst="192.168.0.1")
    >>> get_field_bytes(a[Ether], "src")
    b'\xaa\xaa\xaa\xaa\xaa\xaa'
    >>> get_field_bytes(a[IP], "dst")
    b'\xc0\xa8\x00\x01'
    

    【讨论】:

      猜你喜欢
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2018-01-25
      • 1970-01-01
      相关资源
      最近更新 更多