首页 > 解决方案 > 在 Python 3 中从特定端口读取 TCP 数据包

问题描述

我正在尝试使用此过滤器复制我在 Wireshark 中看到的数据tcp.port == 25565。我尝试过使用 socket 和 pyshark,但是,我似乎找不到一个简单的教程来解释如何做到这一点。

正如您可能通过端口知道的那样,我正在尝试解码 Minecraft 数据包。有关如何获取有效负载并开始解析该数据的建议将非常有帮助。

到目前为止,我有这个代码:

from scapy.all import *

def test(pkt):
    print(pkt)

if __name__ == '__main__':
    single = sniff(filter="tcp.port == 25565", prn=test)

任何帮助是极大的赞赏。

标签: pythonwiresharkpyshark

解决方案


你想要sniff(filter="tcp port 25565", prn=test)

查看scapy 文档

我们可以添加过滤以仅捕获我们感兴趣的数据包。使用标准 tcpdump/libpcap 语法:

该语法在pcap-filter 手册页中指定。

限定符将匹配限制为特定协议。
可能的 proto 有:ether、fddi、tr、wlan、ip、ip6、arp、rarp、decnet、tcp 和 udp。例如,'ether src foo'、'arp net 128.3'、'tcp port 21'、

我认为其中的语法没有得到很好的解释(或者我没有阅读正确的部分),但正如您所看到的,tcp port 21它是一个有效的过滤器并且您正在寻找什么。对于使用 的替代语法and,您将在下面看到:

可以使用以下方式组合原语: 一组带括号的原语和运算符(括号对 Shell 来说是特殊的,必须转义)。
否定('!'或'not')。
连接('&&' 或 'and')。
交替(“||”或“或”)。

如您所见,您的过滤器选项(或原语)应使用运算符进行分组。在这种情况下,您希望两者都为真,因此您希望tcp and port 25565,或者,tcp && port 25565


推荐阅读