簡體   English   中英

需要幫助將源端口號和目標端口號輸出給用戶,使用Python和dpkt從pcap文件讀取數據時需要幫助

[英]Need help outputting the source and destination port number to the user, reading from a pcap file using Python, and dpkt

大家好,這是我第一次使用Python作為編程語言來進行PCAP編程,這是大學的一項任務,除一個小細節外,我幾乎擁有完成任務所需的一切。

我只需要獲取與IP地址關聯的源和目標端口號(例如HTTP Port 80)的輸出即可。

我很高興答案能為正確的方向提供指導,以幫助我自己解決問題。 否則,如果更容易回答,那么我想對所使用的內容及其如何解決問題進行基本的解釋,以便將來在研究中進行更多的PCAP編程時能更好地理解它。

在運行FreeBSD 10.3的Unix系統上使用了此功能。

我已經嘗試使用dpkt.tcp,dpkt.udp,dpkt.ip庫,還嘗試了一些套接字庫,以查看是否可以實現所需的結果,但是運氣不佳。 老實說,我不確定我需要使用什么。

編輯:我確實嘗試使用tcp.sport和tcp.dport,仍然沒有運氣。

我關注的主要領域是在其中添加了評論。

import datetime
import time
import sys
import dpkt
import socket

def printPcap(pcap):
    for (ts,buf) in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(buf)
            if eth.type == dpkt.ethernet.ETH_TYPE_IP:
                ip = eth.data
                ipsrc = socket.inet_ntoa(ip.src)        
                ipdst = socket.inet_ntoa(ip.dst)

                srcport = ??? ###Stuck here for source port
                dstport = ??? ###Stuck here for destination port

                if ip.p == dpkt.ip.IP_PROTO_TCP:        
                    TCP = ip.data
                    iptype = 'tcp'
                elif ip.p == dpkt.ip.IP_PROTO_UDP:   
                    UDP = ip.data
                    iptype = 'udp'
                len = str(ip.len)
                ttl = str(ip.ttl)

                ###My current output
                print '[' +str(datetime.datetime.utcfromtimestamp(ts))+ '] - ' \
                        +ipsrc+ ':' +srcport+ ' -> ' +ipdst+ ':' +dstport+ \
                        ' ('+iptype+', len='+len+', ttl='+ttl+')'

        except:
            pass

樣本預期輸出:

[2018-08-16 02:48:10.238506] - 172.16.11.2:61016 -> 172.16.10.2:80 (tcp, len=52, ttl=63)

也許使用ip.data來獲取TCP數據包以及sport和/或dport

ip = eth.data

if ip.p == dpkt.ip.IP_PROTO_TCP:
    tcp = ip.data
    print('source port: {}, dest port: {}'.format(tcp.sport, tcp.dport))

問題是您的打印語句是虛假的,但是您已經用“裸露的除外”將其隱藏了。 正是由於這個原因,在python中使用裸除被認為是非常差的做法。 另請參見以下問題的答案: 是否應該始終在`except`語句中指定異常類型?

具體來說,您的print語句試圖將整數連接到無效的字符串。

因此,經過修復,並具有:

                if ip.p == dpkt.ip.IP_PROTO_TCP:
                    TCP = ip.data
                    iptype = 'tcp'
                    srcport = TCP.sport
                    dstport = TCP.dport
                elif ip.p == dpkt.ip.IP_PROTO_UDP:
                    UDP = ip.data
                    iptype = 'udp'
                    srcport = UDP.sport
                    dstport = UDP.dport

和此打印語句,它的工作原理是:

                print("[{}] - {}:{} -> {}:{} ({}, len={}, ttl={})".format(
                      datetime.datetime.utcfromtimestamp(ts), ipsrc, srcport,
                      ipdst, dstport, iptype, len, ttl))

最后,至少,我將您的except子句更改為類似這樣的東西,以在將來檢測到此類問題:

        except Exception as exc:
            print("Exception: {}".format(exc))

(請注意,我在這里使用了與python3兼容的打印函數語法,這在python2的print 語句中也可以正常工作。)

編輯:
我剛發生另一件事。 如果遇到的第一個IP數據包既不是TCP也不是UDP,則不會定義srcportdstport ,這將導致AttributeError異常。 留給您清理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM