成果展示
代码
main.py
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QComboBox, QPushButton, QVBoxLayout, QWidget, QTableWidget, QTableWidgetItem, QMessageBox
from PyQt5.QtCore import QThread, pyqtSignal, Qt
from scapy.arch.windows import get_windows_if_list
from scapy.all import *
import threading
import packet_details
import tubiao
class PacketSnifferWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("网络嗅探器")
self.setGeometry(100, 100, 800, 600)
self.setup_ui()
self.packet_count = 0 # 数据包计数器
self.pcap_packets = [] # 用于保存捕获的数据包
def setup_ui(self):
# 创建接口选择下拉菜单
self.interface_var = QComboBox(self)
self.interface_var.move(10, 10)
# 创建表格
self.table_widget = QTableWidget(self)
self.table_widget.setGeometry(10, 40, 780, 300)
self.table_widget.setColumnCount(4)
self.table_widget.setHorizontalHeaderLabels(["协议类型", "源地址", "目的地址", "长度"])
self.table_widget.setSelectionBehavior(QTableWidget.SelectRows)
self.table_widget.cellClicked.connect(self.show_packet_details)
# 创建详细信息文本编辑框
self.detail_text_edit = QTextEdit(self)
self.detail_text_edit.setGeometry(10, 350, 780, 200)
# 创建按钮
self.start_button = QPushButton("开始嗅探", self)
self.start_button.setGeometry(10, 560, 80, 30)
self.start_button.clicked.connect(self.packet_sniffer)
self.stop_button = QPushButton("停止嗅探", self)
self.stop_button.setGeometry(100, 560, 80, 30)
self.stop_button.clicked.connect(self.stop_sniffing)
self.stop_button.setEnabled(False)
self.reset_button = QPushButton("重置", self)
self.reset_button.setGeometry(190, 560, 80, 30)
self.reset_button.clicked.connect(self.reset_sniffer)
self.export_button = QPushButton("导出文件", self)
self.export_button.setGeometry(280, 560, 80, 30)
self.export_button.clicked.connect(self.export_file)
# 添加详细查看按钮
self.details_button = QPushButton("详细查看", self)
self.details_button.setGeometry(370, 560, 100, 30)
self.details_button.clicked.connect(self.open_packet_details)
# 添加图表按钮
self.chart_button = QPushButton("统计图表", self)
self.chart_button.setGeometry(480, 560, 100, 30)
self.chart_button.clicked.connect(self.show_chart_window)
# 获取可用的网络接口名称列表
interfaces = self.get_interface_names()
# 在下拉菜单中添加接口列表
self.interface_var.addItems(interfaces)
self.interface_var.setCurrentIndex(5) # 默认选择第一个接口
def get_interface_names(self):
interfaces = []
for iface in get_windows_if_list():