zhc5827710 发表于 2024-5-23 15:49

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

本帖最后由 zhc5827710 于 2024-5-23 16:02 编辑



目前测试在macOS环境之下
使用python3.12版本 测试过3.9的版本 gui会有entry 和 label 组件不显示问题
运行前需要使用sudo 命令 赋予程序管理员权限 不然会报错 运行命令如下
sudo python3 protocol1.py
protocol1 为你的文件名
众所周知python具有多平台兼容性 但是没有测试linux 与windows系统下的运行情况
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.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())# 默认选择第一个网络接口
    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界面



程序运行界面如下:




xinxiu 发表于 2024-5-23 23:03

感谢分享,等下研究研究

Kbai 发表于 2024-5-24 09:49

学习学习

kings0b 发表于 2024-5-24 17:30

学到了!!!

ztqddj007 发表于 2024-5-26 07:23

谢谢分享 试试咋样

Chengliang12138 发表于 2024-6-4 14:55

感谢分享,学习学习
页: [1]
查看完整版本: 分享一个简单的抓包demo 使用python实现有gui界面