资源简介
基于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
- 上一篇:Fisher算法线性判别分析python实现
- 下一篇:Python实时显示数据
评论
共有 条评论