将 scapy "IP" 类型转换为 "Bytes"



我正在使用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'

最新更新