• 大小: 17KB
    文件类型: .py
    金币: 2
    下载: 2 次
    发布日期: 2021-08-07
  • 语言: Python
  • 标签: scapy抓包  

资源简介

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

资源截图

代码片段和文件信息

# coding=utf-8
import datetime
import threading
import tkinter
from tkinter import *
from tkinter import font filedialog
from tkinter.constants import *
from tkinter.messagebox import askyesno
from tkinter.scrolledtext import ScrolledText
from tkinter.ttk import Treeview

from scapy.layers.inet import *
from scapy.layers.l2 import *
# 用来终止抓包线程的线程事件
stop_sending = threading.Event()
# 用来给抓到扥数据包编号
packet_id = 1
# 用来存放抓到的数据包
packet_list =[]
# 暂停抓包的标志位
pause_flag = False
# 保存文件标志位
save_flag = False
# 停止抓包标志位
stop_flag=False

# 状态栏类
class StatusBar(frame):
    def __init__(self master):
        frame.__init__(self master)
        self.label = Label(self bd=1 relief=SUNKEN anchor=W)
        self.label.pack(fill=X)
    def set(self fmt *args):
        self.label.config(text=fmt % args)
        self.label.update_idletasks()
    def clear(self):
        self.label.config(text=““)
        self.label.update_idletasks()


# 时间戳转为格式化的时间字符串
def timestamp2time(timestamp):
    time_array = time.localtime(timestamp)
    mytime = time.strftime(“%Y-%m-%d %H:%M:%S“ time_array)
    return mytime
“““
数据包列表单击事件响应函数,在数据包列表单击某数据包时,在协议解析区解析此数据包,并在hexdump区显示此数据包的十六进制内容
:param event: TreeView单击事件
:return: None
“““
def on_click_packet_list_tree(event):
    # event.widget获取Treeview对象,调用selection获取选择对象名称返回结果为字符型元祖
    selected_item = event.widget.selection()
    # 清空packet_dissect_tree上现有的内容------------------------
    packet_dissect_tree.delete(*packet_dissect_tree.get_children())
    # 设置协议解析区的宽度
    packet_dissect_tree.column(‘Dissect‘ width=packet_list_frame.winfo_width())
    # 转换为整型
    packet_id = int(selected_item[0])-1
    # 取出要分析的数据包
    packet = packet_list[packet_id]
    #packet.show()
    lines = (packet.show(dump=True)).split(‘\n‘)  # dump=True返回字符串,不打出,\n换行符
    last_tree_entry = None
    for line in lines:
        if line.startswith(‘#‘):
            line = line.strip(‘# ‘)  # 删除#
            last_tree_entry = packet_dissect_tree.insert(‘‘ ‘end‘ text=line)  # 第一个参数为空表示根节点
        else:
            packet_dissect_tree.insert(last_tree_entry ‘end‘ text=line)
        col_width = font.Font().measure(line)
        # 根据新插入数据项的长度动态调整协议解析区的宽度
        if packet_dissect_tree.column(‘Dissect‘ width=None) < col_width:
            packet_dissect_tree.column(‘Dissect‘ width=col_width)

    if IP in packet:
        ip = packet[IP]
        ip_chksum = ip.chksum
        # ip.show()#抓到的IP报文
        ip.chksum = None
        # ip.show()
        ip_check = IP(raw(ip)).chksum
        ip.chksum = ip_chksum
        print(ip_chksum “计算出的IP首部校验和:“ ip_check)
        if TCP in packet:
            tcp = packet[TCP]
            tcp_chksum = tcp.chksum
            tcp.chksum = None
            tcp_check = TCP(raw(tcp)).chksum
            tcp.chksum = tcp_chksum
            print(tcp_chksum “计算出的TCP检验和:“ tcp_check)
            information = “IP与TCP的校验和检查通过\r\nIP的校验和为:{chksum_ip}\r\nT

评论

共有 条评论

相关资源