网络嗅探器的设计与实现

网络嗅探器的设计与实现

1. 介绍

    本人开发的网络嗅探器可以抓取并分析网络数据包,并支持wireshark语法,实现协议的过滤功能。
    项目地址:https://github.com/gao79135/network-sniffer/tree/master

img
img

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/
posted @   夏目^_^  阅读(515)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示