一、实现功能
基于Tkinter的Python GUI界面设计,能分条展示数据包的概要信息(summary()),分层解析数据包,可显示数据包的十六进制编码值(hexdump());在抓包的同时解析数据包(不能等抓包停止后才解析),可判断IP、TCP或UDP数据包的校验和是否正确;支持BPF过滤器,抓包过程可以暂停和停止;可将数据包存储在pcap文件中,以供wireshark或其它数据包解析工具分析;可以在退出时提示用户进行保存未保存的数据包,进行保存工作;可以在再次开始新的抓包前提示用户保存未保存的数据包。
注:
源代码:https://download.youkuaiyun.com/download/wmrem/10439913
运行前需要先安装第三方库scapy,安装方法:https://blog.youkuaiyun.com/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格式的文件