使用python - Scapy脚本获取数据包的端口号作为列表

时间:2017-01-18 09:37:55

标签: python scapy

我想以列表的形式获取数据包的端口号,例如:

[234,456,456,222,22]....

但不是:

[234][435][456][222][222]....

怎么做?

Fetch source address and port number of packet - Scapy script

2 个答案:

答案 0 :(得分:1)

确定。所以这可能不是最优雅的解决方案,但我认为它符合您的需求。我设置了一个字典,将多个键映射到多个值。 IP映射到映射到计数器的多个端口。生成的字典包含信息。数据包将根据您帖子中的日期进行评估。如果您的.pcap不是那些日期,请在测试之前删除该检查或更改时间值。希望这会有所帮助。

from scapy.all import *

ips = {}
pcap = rdpcap('test_pcap.pcap')

def build_dict(pkt):
    port_count = 1

    if pkt.haslayer(IP):
        ip = pkt[IP].src
        if pkt.haslayer(UDP) or pkt.haslayer(TCP):
            port = pkt.sport
            if ip in ips:  # Checks to see if the IP is already there
                if port in ips[ip]:  # Checks to see if the port is already there.
                    port_count += ips[ip][port] #If so, increments the counter by 1
            ips.setdefault(ip, {})[port] = port_count # Writes to the dictionary

for pkt in pcap:
    time = pkt.time
    if time > 1484481600 and time < 1484827200: # Checks to see if the packet is within the date range
        build_dict(pkt)
    else: pass

for k, v in ips.items():
    print(k, v)

答案 1 :(得分:1)

最简单的方法是通过可迭代的理解来构建列表(假设plist是您的数据包列表):

ports = [port for pkt in plist if UDP in pkt or TCP in pkt
         for port in [pkt.sport, pkt.dport]]

当然,如果您想使用不同的端口,可以使用set

ports = {port for pkt in plist if UDP in pkt or TCP in pkt
         for port in [pkt.sport, pkt.dport]}