简单抓包工具——仿照wireshark设计的网络协议解析器(python+scapy+pycharm)

本文介绍了一个基于Python和Scapy的GUI抓包工具,具备实时解析数据包、校验数据包校验和、支持BPF过滤、暂停/继续/停止抓包、保存数据包至pcap文件等功能。该工具模仿Wireshark设计,用户交互友好,可方便地查看数据包概要、分层解析和十六进制内容。
摘要由CSDN通过智能技术生成

一、实现功能

    基于Tkinter的Python  GUI界面设计,能分条展示数据包的概要信息(summary()),分层解析数据包,可显示数据包的十六进制编码值(hexdump());在抓包的同时解析数据包(不能等抓包停止后才解析),可判断IP、TCP或UDP数据包的校验和是否正确;支持BPF过滤器,抓包过程可以暂停和停止;可将数据包存储在pcap文件中,以供wireshark或其它数据包解析工具分析;可以在退出时提示用户进行保存未保存的数据包,进行保存工作;可以在再次开始新的抓包前提示用户保存未保存的数据包。

注:

源代码:https://download.csdn.net/download/wmrem/10439913

运行前需要先安装第三方库scapy,安装方法:https://blog.csdn.net/wmrem/article/details/80004819

二、主要函数说明

1.抓取数据包并对抓到的数据包进行相应处理

def capture_packet():
    1. 获取并设置过滤条件
    filters = fitler_entry.get()
    2.设置停止抓包的条件stop_filter
    stop_sending.clear()
    3.清空抓到的数据包列表
    packet_list.clear()
    4.用sniff(prn=处理抓到的数据包,filter=过滤条件,stop_filter=停止抓包的条件)进行抓包 
    sniff(prn=处理抓到的数据包, filter=过滤条件filters, stop_filter=停止抓包的条件)

2.对抓到的数据包进行处理的函数

def process_packet(packet):
    if 没有点击暂停按钮:
        1.将抓到的包存在列表中
        packet_list.append(packet)
        2.获取抓包的时间
        packet_time= timestamp2time(packet.time)
3.设置默认源地址和目的地址
src = packet[Ether].src
dst = packet[Ether].dst
		4.建立协议查询字典判断Ether帧中封装的数据包的类型,设置proto字段的值,如果是IP数据包则进行第二次判断,如果IP数据包中封装的是TCP或UDP数据包则进行第三次判断
        type = packet[Ether].type
        types = {0x0800:'IPv4',0x0806:'ARP',0x86dd:'IPv6',0x88cc:'LLDP',0x891D:'TTE'}
        5.判断Ether帧中封装的数据包类型
        6.判断是否为IP包
        if proto == 'IPv4':
            7.建立协议查询字典,更改源地址和目的地址为源IP和目的IP地址,判断更改proto字段的值
            protos = {1: 'ICMP', 2: 'IGMP', 4: 'IP', 6: 'TCP',……17: 'UDP'}
            src = packet[IP].src
            dst = packet[IP].dst
        8. 判断是否包含TCP或UDP包
        if TCP包:
            protos_tcp = {80: 'Http', 443: 'Https',……, 25: 'SMTP'}
            9.建立字典,根据端口号判断协议类型并修改proto字段的值
        elif UDP包:
            10.根据端口号判断协议类型并修改proto字段的值
        11.行列表中插入捕获的数据包的信息并显示
        packet_list_tree.insert("", 'end', packet_id, text=packet_id,
                            values=(packet_id, packet_time, src, dst, proto, length, info)) 

3.开始按钮的单击响应函数,如果是停止后再次开始捕获,要提示用户保存已经捕获的数据

def start_capture():
    if 已经停止捕获发,但是没进行保存操作:
        1.弹出选择窗口,选择是否进行保存数据包。如果选择是则弹出保存文件窗口进行文件保存操作再开始新的一次抓包操作,选择否则直接开始一次新的抓包,选择取消则直接返回,不进行新的抓包操作
    2. 设置开始、保存按钮为不可用,暂停、停止按钮可操作,并设置停止标识stop_flag = False
    start_button['state'] = DISABLED  # 不可操作
    ……
    stop_button['state'] = NORMAL
    stop_flag = False
    if 没进行暂停操作:
        3.清空已经抓到的数据包列表并设置数据包编号为1
        4. 开启新线程进行抓包,设置保存标识save_flag = False
        t = threading.Thread(target=capture_packet)
        t.setDaemon(True)
        t.start()
        save_flag = False
    else:
        5.设置暂停标识pause_flag = False

4.暂停按钮的单击响应函数,这时仍然在抓包,只是不对抓到的包进行处理

def pause_capture():
    1.设置开始按钮为可用,暂停按钮为不可用,并修改暂停标识pause_flag = True
    start_button['state'] = NORMAL  # 可操作
    pause_button['state'] = DISABLED  # 不可操作
    global pause_flag
    pause_flag = True

5.停止按钮单击响应函数,终止线程,退出sniff()函数停止抓包

def stop_capture():
    1. 终止线程,停止抓包
    stop_sending.set()
    2. 设置开始按钮为可用,暂停按钮为不可用,保存为可用,修改暂停标识pause_flag = False,停止标识stop_flag = True
    start_button['state'] = NORMAL # 可操作
    …
    stop_button['state'] = DISABLED
    pause_flag = False
    stop_flag = True

6.保存按钮的单击响应函数,将抓到的数据包保存为pcap格式的文件 


                
  • 22
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 34
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值