我正在使用python3和nfqueue动态修改数据包。
背景
Scapy版本:2.4.1
Python的NetfilterQueue(PyPi(具有将数据包转换为"scapy兼容"字符串/字节的方法,反之亦然,这些方法是:
-
get_payload
,在python 2中返回scapy兼容的字符串,在python 3中返回BYTES。 -
set_payload
,它在我们完成scapy之后设置数据包的有效载荷。
问题
在我使用get_payload
之后,我可以愉快地使用scapy的IP()
方法来修改数据包的部分。然而,当我完成后,我留下了一个类型为"IP"的对象,我想将其转换为类型为"字节"(以便能够在其上使用set_payload
(。
打印IP属性时的代码输出
(在这种情况下,'nnn'是实际的数据包(
running...
<class 'scapy.layers.inet.IP'>
b'Ex00x008x82x00@x00@x06xbaxbdx7fx00x00x01x7fx00x00x01xeajx1fx91(x02xb9xffqxa4xd6xbex80x18x02x00xf2Wx00x00x01x01x08nxa8bx11*xa8bx11*nnnn'
b'nnnn'
Argument 'payload' has incorrect type (expected bytes, got IP)
Q
如何在python3中将类型scapy.layers.inet.IP
转换为类型"字节"?
从源代码中,您可以调用构建方法,也可以将IP
对象直接传递给bytes
,因为IP
实现了__bytes__
dunder方法:
from scapy.layers.inet import IP
p = IP(dst="github.com")
print(p) # b'Ex00x00x14x00x01x00x00@x00lx82nx0cx02x05x8cRvx04'
print(p.build()) # b'Ex00x00x14x00x01x00x00@x00lx82nx0cx02x05x8cRvx04'
print(bytes(p)) # b'Ex00x00x14x00x01x00x00@x00lx82nx0cx02x05x8cRvx04'
print(raw(p)) # b'Ex00x00x14x00x01x00x00@x00lx82nx0cx02x05x8cRvx04'