本帖最后由 zhc5827710 于 2024-5-23 16:02 编辑
目前测试在macOS环境之下
使用python3.12版本 测试过3.9的版本 gui会有entry 和 label 组件不显示问题
运行前需要使用sudo 命令 赋予程序管理员权限 不然会报错 运行命令如下
sudo python3 protocol1.py
protocol1 为你的文件名
众所周知python具有多平台兼容性 但是没有测试linux 与windows系统下的运行情况
[Python] 纯文本查看 复制代码 import threading # 导入线程模块
import tkinter as tk # 导入Tkinter模块用于GUI
from tkinter.scrolledtext import ScrolledText # 导入ScrolledText用于滚动文本框
import scapy.all as scapy # 导入Scapy模块用于网络数据包捕获和处理
import psutil # 导入psutil模块用于获取网络接口信息
# 创建一个事件对象,用于控制线程的停止
stop_event = threading.Event()
# 创建一个列表,用于存储捕获到的数据包
packets = []
# 定义数据包捕获函数
def packet_capture(interface, ip):
# 定义数据包回调函数
def packet_callback(packet):
# 如果数据包包含IP层并且目标IP是指定的IP
if packet.haslayer(scapy.IP) and packet[scapy.IP].dst == ip:
# 将数据包添加到packets列表中
packets.append(packet)
# 使用Scapy的sniff函数捕获数据包
scapy.sniff(iface=interface, prn=packet_callback, stop_filter=lambda _: stop_event.is_set())
# 定义数据包处理函数
def packet_processing(output_text):
# 当stop_event未设置或packets列表不为空时循环
while not stop_event.is_set() or packets:
# 如果packets列表不为空
if packets:
# 从packets列表中取出第一个数据包
packet = packets.pop(0)
# 在输出文本框中插入数据包摘要信息
output_text.insert(tk.END, f"Packet: {packet.summary()}\n")
# 滚动到文本框的末尾
output_text.see(tk.END)
# 定义开始捕获函数
def start_capture(interface, ip, output_text):
# 清除stop_event
stop_event.clear()
# 创建捕获线程
capture_thread = threading.Thread(target=packet_capture, args=(interface, ip))
# 创建处理线程
processing_thread = threading.Thread(target=packet_processing, args=(output_text,))
# 启动捕获线程
capture_thread.start()
# 启动处理线程
processing_thread.start()
# 定义停止捕获函数
def stop_capture(output_text):
# 设置stop_event
stop_event.set()
# 在输出文本框中插入停止成功信息
output_text.insert(tk.END, "Stop Success\n")
# 滚动到文本框的末尾
output_text.see(tk.END)
# 获取网络接口列表
def get_network_interfaces():
# 获取所有网络接口的地址信息
interfaces = psutil.net_if_addrs()
# 返回网络接口名称列表
return list(interfaces.keys())
# 创建GUI界面
def create_gui():
# 创建主窗口
root = tk.Tk()
# 设置窗口标题
root.title("Packet Sniffer")
# 设置窗口大小
root.geometry("800x600")
# 创建标签和输入框
interface_label = tk.Label(root, text="Network Interface:") # 创建网络接口标签
interface_label.place(relx=0.05, rely=0.05) # 设置标签位置
interface_var = tk.StringVar(root) # 创建字符串变量用于存储选择的网络接口
interface_var.set(get_network_interfaces()[0]) # 默认选择第一个网络接口
interface_menu = tk.OptionMenu(root, interface_var, *get_network_interfaces()) # 创建下拉菜单
interface_menu.place(relx=0.25, rely=0.05, relwidth=0.65) # 设置下拉菜单位置和宽度
ip_label = tk.Label(root, text="Target IP:") # 创建目标IP标签
ip_label.place(relx=0.05, rely=0.15) # 设置标签位置
ip_entry = tk.Entry(root) # 创建输入框
ip_entry.place(relx=0.25, rely=0.15, relwidth=0.65) # 设置输入框位置和宽度
# 创建输出文本区域
output_text = ScrolledText(root, wrap=tk.WORD) # 创建滚动文本框
output_text.place(relx=0.05, rely=0.25, relwidth=0.9, relheight=0.6) # 设置文本框位置和大小
# 创建按钮
start_button = tk.Button(root, text="Start", command=lambda: start_capture(interface_var.get(), ip_entry.get(),
output_text)) # 创建开始按钮并设置点击事件
start_button.place(relx=0.25, rely=0.9, relwidth=0.2) # 设置按钮位置和宽度
stop_button = tk.Button(root, text="Stop", command=lambda: stop_capture(output_text)) # 创建停止按钮并设置点击事件
stop_button.place(relx=0.55, rely=0.9, relwidth=0.2) # 设置按钮位置和宽度
# 启动主事件循环
root.mainloop()
# 主函数入口
if __name__ == "__main__":
create_gui() # 创建并运行GUI界面
程序运行界面如下:
|