如何将 scapy 字段作为字节?

How do I get a scapy field as bytes?

我将原始字节转换成一个 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) -> 类型错误:没有编码的字符串参数

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

bytes(scapy_packet[Ether].src) -> 类型错误:没有编码的字符串参数

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

bytes(scapy_packet.get_field("src")) -> 类型错误:无法将 'SourceMACField' 对象转换为字节

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

你可以这样使用:(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'