在 Python 3 中读取进出特定端口的 TCP 数据包

Reading TCP packets to and from a specific port in Python 3

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

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

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

from scapy.all import *

def test(pkt):
    print(pkt)

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

非常感谢任何帮助。

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

看看scapy documentation

We can add filtering to capture only packets that are interesting to us. Use standard tcpdump/libpcap syntax:

该语法在 pcap-filter man page 中指定。

qualifiers restrict the match to a particular protocol.
Possible protos are: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp. E.g., 'ether src foo', 'arp net 128.3', 'tcp port 21',

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

Primitives may be combined using: A parenthesized group of primitives and operators (parentheses are special to the Shell and must be escaped).
Negation ('!' or 'not').
Concatenation ('&&' or 'and').
Alternation ('||' or 'or').

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