2017-01-18 5 views
0

を私は次のように、リストとして、パケットのポート番号を取得したい:のpythonを使用して、リストとして、パケットのポート番号を取得する - Scapyスクリプト

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

方法:

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

ではなくとして

これを行う?

Fetch source address and port number of packet - Scapy script

+0

あなたは、ダブルスをフィルタリング同じポートが表示されますどのように多くの時間をカウントするか、単にすべてのパケットからのすべてのポートとIPのリストを作成するために探していましたか? – Noob123

+0

はい、1.倍数を除外し、同じポートが何回表示されているかを数えます。また、2.iはpcapからデータをフェッチするための開始時刻と終了時刻を指定したいと考えています。 15.01.2017〜19.01.2017 – RatDon

答えて

1

[OK]をクリックします。だから、これは最も洗練されたソリューションではないかもしれませんが、私はそれがあなたが探しているものを満たすと思います。私は、複数のキーを複数の値にマッピングする辞書を設定しました。 IPは、カウンタにマップされた複数のポートにマップされます。結果の辞書には情報が含まれています。パケットはあなたの投稿の日付と比較して評価されます。あなたの.pcapがその日付のものでないかどうかテストする前に、そのチェックを削除するか、時間の値を変更してください。お役に立てれば。あなたが使用する異なるポートをしたい場合は

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

はもちろん、あなたがsetを使用することができます。

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

最も簡単な方法は、(自分のパケットリストをplistをされたと仮定して)反復可能な理解を経由してリストを構築することです:

ports = {port for pkt in plist if UDP in pkt or TCP in pkt 
     for port in [pkt.sport, pkt.dport]} 
関連する問題