如何将 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'
我将原始字节转换成一个 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'