PyQt5 网络嗅探器:实时捕获和分析网络流量

使用 PyQt5 开发的网络嗅探器,可以实时捕获和分析网络流量。该工具支持多种网络协议,包括 HTTP、HTTPS、FTP、SMTP、IMAP、POP3、DNS 等。

功能特色:

  • 实时捕获网络流量
  • 支持多种网络协议
  • 显示捕获的流量信息,包括源 IP、源端口、目标 IP、目标端口、数据包长度
  • 提供数据包详细信息查看功能
  • 支持重置表格,清空捕获的数据

代码:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QComboBox, QTableWidget, QTableWidgetItem, QVBoxLayout, QHBoxLayout, QWidget, QTextEdit, QHeaderView
from scapy.all import sniff
import threading

class Sniffer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('PyQt5 Network Sniffer')
        self.setGeometry(100, 100, 1200, 800)

        mainLayout = QVBoxLayout()

        controlLayout = QHBoxLayout()

        self.comboBox = QComboBox(self)
        self.comboBox.addItems(['All', 'HTTP', 'HTTPS', 'FTP', 'SMTP', 'IMAP', 'POP3', 'DNS'])
        controlLayout.addWidget(self.comboBox)

        self.startButton = QPushButton('Start Sniffing', self)
        self.startButton.clicked.connect(self.start_sniffing)
        controlLayout.addWidget(self.startButton)

        self.stopButton = QPushButton('Stop Sniffing', self)
        self.stopButton.clicked.connect(self.stop_sniffing)
        controlLayout.addWidget(self.stopButton)

        self.resetButton = QPushButton('Reset', self)
        self.resetButton.clicked.connect(self.reset_table)
        controlLayout.addWidget(self.resetButton)

        mainLayout.addLayout(controlLayout)

        self.tableWidget = QTableWidget(self)
        self.tableWidget.setColumnCount(5)
        self.tableWidget.setHorizontalHeaderLabels(['源IP', '源端口', '目标IP', '目标端口', '长度'])
        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.tableWidget.clicked.connect(self.show_packet_detail)
        mainLayout.addWidget(self.tableWidget)

        self.textEdit = QTextEdit(self)
        mainLayout.addWidget(self.textEdit)

        container = QWidget()
        container.setLayout(mainLayout)
        self.setCentralWidget(container)

        self.stop_sniffing_flag = False
        self.packets = []

    def packet_callback(self, packet):
        self.packets.append(packet)
        src_ip = packet['IP'].src if packet.haslayer('IP') else '-'
        dst_ip = packet['IP'].dst if packet.haslayer('IP') else '-'
        src_port = packet[1].sport if hasattr(packet[1], 'sport') else '-'
        dst_port = packet[1].dport if hasattr(packet[1], 'dport') else '-'
        length = len(packet)

        rowPosition = self.tableWidget.rowCount()
        self.tableWidget.insertRow(rowPosition)
        self.tableWidget.setItem(rowPosition, 0, QTableWidgetItem(src_ip))
        self.tableWidget.setItem(rowPosition, 1, QTableWidgetItem(str(src_port)))
        self.tableWidget.setItem(rowPosition, 2, QTableWidgetItem(dst_ip))
        self.tableWidget.setItem(rowPosition, 3, QTableWidgetItem(str(dst_port)))
        self.tableWidget.setItem(rowPosition, 4, QTableWidgetItem(str(length)))

    def start_sniffing(self):
        self.startButton.setEnabled(False)  # Disable the startButton
        protocol = self.comboBox.currentText().lower()
        if protocol == 'all':
            filter_str = 'ip'
        else:
            filter_str = {
                'http': 'tcp port 80',
                'https': 'tcp port 443',
                'ftp': 'tcp port 21',
                'smtp': 'tcp port 25',
                'imap': 'tcp port 143',
                'pop3': 'tcp port 110',
                'dns': 'udp port 53'
            }.get(protocol, 'ip')

        self.stop_sniffing_flag = False
        t = threading.Thread(target=self.sniff_thread, args=(filter_str,))
        t.start()

    def sniff_thread(self, filter_str):
        sniff(prn=self.packet_callback, filter=filter_str, stop_filter=lambda x: self.stop_sniffing_flag)

    def stop_sniffing(self):
        self.stop_sniffing_flag = True
        self.startButton.setEnabled(True)  # Enable the startButton after stopping sniffing

    def reset_table(self):
        self.tableWidget.setRowCount(0)
        self.textEdit.clear()
        self.packets = []

    def show_packet_detail(self):
        row = self.tableWidget.currentRow()
        packet = self.packets[row]
        self.textEdit.clear()
        self.textEdit.append(packet.show(dump=True))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWin = Sniffer()
    mainWin.show()
    sys.exit(app.exec_())

使用方法:

  1. 安装 PyQt5 和 scapy 库:
pip install PyQt5 scapy
  1. 运行代码,启动网络嗅探器。
  2. 选择要捕获的协议。
  3. 点击“Start Sniffing”按钮开始捕获网络流量。
  4. 点击“Stop Sniffing”按钮停止捕获网络流量。
  5. 点击“Reset”按钮重置表格,清空捕获的数据。
  6. 点击表格中的任意行,在下方文本框中查看数据包详细信息。

注意事项:

  • 运行该程序需要管理员权限。
  • 该程序只能捕获本机网络流量。
  • 不要使用该程序对未经授权的网络进行嗅探。

更多信息:

PyQt5 网络嗅探器:实时捕获和分析网络流量

原文地址: https://www.cveoy.top/t/topic/bpBa 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录