如何获取 scapy 字段作为字节?

问题描述 投票:0回答:2

我将原始字节转换为 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__”

python scapy
2个回答
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'

0
投票

之前的建议很好,但是

i2m()
并不总是返回
bytes

因此,效果会更好

def get_field_bytes(pkt, name):
     fld, val = pkt.getfield_and_val(name)
     return fld.addfield(pkt, b"", val)
© www.soinside.com 2019 - 2024. All rights reserved.