使用Scapy如何提取TCP数据包的原始数据?

8
我使用scapy模块的sniff函数。我的过滤器和prn函数表现出色。但是,现在我想提取TCP数据包的原始数据,并使用十六进制或二进制格式进行处理。
这里是scapy中Packet类的文档链接。
我该如何做呢?
我尝试使用print packet[Raw],但似乎它被转换为ASCII或类似的东西。我想保留它的十六进制或二进制格式。
1个回答

16

您可以使用scapy.compat.raw1获取数据包的原始字节:

from scapy.all import raw
raw(packet)

前者跨版本兼容,但如果您保证使用的是Python 3并且不需要支持Python 2,则可以直接调用bytes,而不需要一个特定的导入语句(这实际上就是scapy.compat.raw在幕后实现的方式):

bytes(packet)

您可以使用scapy.compat.bytes_hex2以可读的格式打印数据包的原始字节:

from scapy.all import bytes_hex
print(bytes_hex(packet))

1 scapy.compat.raw的实现可以在这里找到。
2 scapy.compat.bytes_hex的实现可以在这里找到。


这已经过时了/该函数不再存在。在Python 3中,似乎只需调用bytes(packet)即可,无需导入任何内容。 - mozzbozz
感谢您的评论。我已经编辑了我的答案,以反映在Python 3中直接调用bytes(packet)的选项。然而,我确信scapy.compat.raw仍然存在(https://github.com/secdev/scapy/blob/master/scapy/compat.py#L264),并且具有跨版本兼容性的优势。 - Yoel

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