python-3.x 转换一个scapy“IP”类型为“字节”

o2gm4chl  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(80)

我正在使用python3和nfqueue来动态修改数据包。

后台

Scapy版本:2.4.1
Python的NetfilterQueue(PyPi)具有将数据包转换为“scapy-compatible”字符串/字节的方法,反之亦然,这些方法包括:

  • get_payload,在python 2中返回scapy兼容的string,在python 3中返回BYTES
  • set_payload,在我们完成scapy之后设置数据包的有效载荷。

问题

在我使用get_payload之后,我可以使用scapy的IP()方法愉快地修改数据包的部分。然而,当我完成时,我只剩下一个类型为“IP”的对象,我想将其转换为类型为“bytes”(以便能够在它上使用set_payload)。

打印IP属性时代码输出

(在这种情况下,“nnnn”是实际的数据包数据)

running...

<class 'scapy.layers.inet.IP'>

b'E\x00\x008\x82\x00@\x00@\x06\xba\xbd\x7f\x00\x00\x01\x7f\x00\x00\x01\xeaj\x1f\x91(\x02\xb9\xffq\xa4\xd6\xbe\x80\x18\x02\x00\xf2W\x00\x00\x01\x01\x08\n\xa8b\x11*\xa8b\x11*nnnn'

b'nnnn'

Argument 'payload' has incorrect type (expected bytes, got IP)

字符串

Q

如何在python3中将scapy.layers.inet.IP类型转换为“bytes”类型?

vdgimpew

vdgimpew1#

从源代码中,您可以调用build方法,也可以将IP对象直接传递给bytes,因为IP实现了__bytes__ dunder方法:

from scapy.layers.inet import IP

p = IP(dst="github.com")

print(p)         # b'E\x00\x00\x14\x00\x01\x00\x00@\x00l\x82\n\x0c\x02\x05\x8cRv\x04'
print(p.build()) # b'E\x00\x00\x14\x00\x01\x00\x00@\x00l\x82\n\x0c\x02\x05\x8cRv\x04'
print(bytes(p))  # b'E\x00\x00\x14\x00\x01\x00\x00@\x00l\x82\n\x0c\x02\x05\x8cRv\x04'
print(raw(p))    # b'E\x00\x00\x14\x00\x01\x00\x00@\x00l\x82\n\x0c\x02\x05\x8cRv\x04'

字符串

相关问题