需要帮助将源端口号和目标端口号输出给用户,使用Python和dp从pcap文件中读取

2024-04-26 01:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好这是我第一次用Python编程语言做PCAP编程,这是为了大学的一个任务,除了一个小细节之外,我基本上掌握了完成任务所需的一切。在

我只需要得到与IP地址相关联的源和目标端口号(例如HTTP端口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

预期输出示例:

^{pr2}$

Tags: importipfordatadatetimelenpcapsocket
2条回答

也许使用ip.data来获得TCP包和sport和/或{}?在

ip = eth.data

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

问题是你的print语句是假的,但是你用“bare except”隐藏了它。正因为这个原因,在python中使用bare except被认为是非常糟糕的实践。另请参阅此问题的答案:Should I always specify an exception type in `except` statements?

特别是,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

而这张打印声明,它起作用了:

^{pr2}$

最后,至少,我会将您的except子句改为类似这样的内容,以便在将来发现此类问题:

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

(请注意,我在这里使用了python3兼容的print函数语法,它也可以很好地与python2的print语句配合使用)

编辑:
还有一件事发生在我身上。如果遇到的第一个IP包既不是TCP也不是UDP,则不会定义srcport和{},这将导致AttributeError异常。把它留给你清理。在

相关问题 更多 >

    热门问题