将scapy中的“IP”类型转换为“Bytes”

3

我正在使用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”类型的对象,我想将其转换为“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)

问题

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

1个回答

4
从源代码中,你可以调用build方法,或者直接将你的IP对象传递给bytes作为IP实现__bytes__特殊方法。
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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接