网络嗅探器的设计与实现
1. 介绍
中国科学院大学软件与系统安全作业:网络嗅探器
项目地址:https://github.com/gao79135/network-sniffer/tree/master
本人开发的网络嗅探器可以抓取并分析网络数据包,并支持wireshark语法,实现协议的过滤功能。
2. 项目的技术栈
本项目前端使用qt(qt-designer)来进行布局。
后端使用python通过scapy框架来进行数据包的处理。
scapy版本:Version 2.5.0
python版本:Version 3.9.1
qt版本:Pyside6
3. 项目的技术要点
3.1 如何获取网络数据包?
我们可以使用scapy自带的AsyncSniffer函数来实现异步抓包。
所使用的该函数的参数如下:
1. iface为需要监听的网络接口
2. prn为回调函数(每当AsyncSniffer函数抓取到包时,就会调用此回调函数)
3. filter指定需要过滤的条件(默认支持wireshark语法)。
之后,我们调用该对象的start方法就可以实现异步的抓取了。
在前端中,单击按钮后发出信号触发槽函数,通过槽函数来执行数据包的抓取。
3.2 如何解析网络数据包?
我们可以在上述的回调函数中实现协议的解析。
AsyncSniffer函数抓取到包时,会向指定的回调函数中传入参数。
我们可以使用该对象(这里假设为packet)来解析网络数据包的相关信息。
例如:
1. 我们可以使用如下方式来获得包的各种层信息。
packet['IP'] # 获取IP层信息
packet['TCP'] # 获取TCP层信息
...
2. 获取到包的各层对象后,我们可以使用如下方式来获得各层的详细信息。
packet['IP'].fields.items() # 获取IP层的所有详细信息。
3. 我们可以使用该对象的summary方法来获得包的摘要信息。
packet.summary()
...
3.3 如何实现协议的过滤?
关于协议的过滤,我们可以在开始嗅探之前在AsyncSniffer函数的filter参数指定一个字符串。
这个字符串内容的获取我们可以在前端的输入组件中进行输入,当输入之后(输入框的内容发生了变化),该组件就会发出一个信号触发槽函数,我们可以在槽函数中将输入框的内容赋值给该变量。
AsyncSniffer函数默认支持wireshark语法来实现协议的过滤。
3.4 如何将获取的网络数据包的相关数据回显在页面上?
这里介绍一个通用思路:
1. 通过上述的各层对象来获取详细信息。
2. 将详细信息存储在列表或字典中。
3. 添加之后,我们可以发出Qt的自定义信号来触发与之对应的槽函数,将数据回显在页面上。
这里需要注意的是:当我们需要实时的将抓取的包回显在页面上时,需要考虑两个线程(抓取数据包的线程与主线程)之间的并发问题。
有时候可能会出现抓取数据包的线程抓取包的频率很高,而主线程来不及回显,进而造成数据不一致的问题。
解决此类问题,我们可以采用锁机制,只有当回显完数据之后,才可以抓取下一个数据包。
capture_thread:
lock.acquire()
process to generate data
send signal to main_thread
main_thread:
receive signal to process data
...
show the screen
lock.release()
3.5 如何获取包的二进制信息?
我们可以使用packet对象的hexdump函数来获取包的二进制信息。
hexdump函数接收两个参数,第一个参数为packet对象,第二个参数为布尔值。如果为True,那么就会将内容输出到变量当中。如果为False,那么就会输出到屏幕中。
3.6 如何实现重新嗅探的功能?
AsyncSniffer函数所返回的对象有一个stop方法可以停止嗅探。
停止嗅探后,清空前端中所有组件的内容,之后再调用start方法重新开始嗅探。
在前端中,单击按钮后发出信号触发槽函数,通过槽函数来执行数据包的重新嗅探。
3.7 如何实现关于和退出功能?
当我们点击菜单栏的关于按钮时,就会发出信号,从而进一步触发槽函数。
在槽函数中,我们可以使用Qt中的Dialog组件来持续显示我们的信息。
当我们点击菜单栏的退出按钮时,就会发出信号,从而进一步触发槽函数。
在槽函数中,我们可以使用QApplication对象(也就是你要开发的软件)的quit方法来实现程序的退出。
4. 更多信息
关于scapy的其余方法,这里不再赘述,可以查看scapy的官方文档(老实说,我也说不出啥,看文档写的)。
https://scapy.readthedocs.io/en/latest/
关于Pyside6的其余方法,这里不再赘述,可以查看Pyside6的官方文档。
https://www.pythonguis.com/topics/pyside6/
标签:函数,scapy,嗅探器,抓取,packet,网络,设计,数据包,AsyncSniffer
From: https://www.cnblogs.com/gao79135/p/17823086.html