我将原始字节转换为 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:没有编码的字符串参数
scapy_packet[Ether].src.__bytes__()
-> 'str' 对象没有属性 '__bytes__'
bytes(scapy_packet[Ether].src)
-> TypeError:没有编码的字符串参数
scapy_packet.src.__bytes__()
-> 'str' 对象没有属性 '__bytes__'
bytes(scapy_packet.get_field("src"))
-> TypeError:无法将“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'
之前的建议很好,但是
i2m()
并不总是返回bytes
因此,效果会更好
def get_field_bytes(pkt, name):
fld, val = pkt.getfield_and_val(name)
return fld.addfield(pkt, b"", val)