分享一个简单的抓包demo 使用python实现有gui界面

查看 59|回复 3
作者:zhc5827710   
目前测试在macOS环境之下
使用python3.12版本 测试过3.9的版本 gui会有entry 和 label 组件
[color=]不显示
问题
运行前需要使用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界面
程序运行界面如下:


image.png (193.14 KB, 下载次数: 0)
下载附件
2024-5-23 15:52 上传

数据包, 线程

xinxiu   

感谢分享,等下研究研究
Kbai   

学习学习
kings0b   

学到了!!!
您需要登录后才可以回帖 登录 | 立即注册

返回顶部