嗅探工具开发(作业报告)

实验要求

本次实验的要求是实现嗅探工具,且相关要求如下:

  1. 可以能规范解析常见协议的数据包
  2. 能完整显示请求从发起到结束的交互过程
  3. 嗅探工具能够根据协议类型、端口、地址等信息来进行筛选
  4. 拥有操作界面,便于使用

同时,本次实验的其他需求如下:

  1. 具有统计功能和界面
  2. 支持多平台使用
  3. 具有数据包保存和打开功能,以便于数据分析
  4. 操作界面简明,且打包后占用资源小。

本次实验中实现的嗅探工具JSniffer是基于JavaFX为UI部分、PCAP4J作为底层抓包库来实现,且具有简明操作界面的多平台网络嗅探工具,经过测试分析,具有多平台、操作易用的特性。

需求分析

基本分析

本次实验中考虑到需要同时实现简明操作界面、多平台、程序占用资源少等需求,且本次实验的开发平台为windows x64和 macos aarch64,所有采用Java平台中的Javafx作为界面,Pcap4j 作为底层进行嗅探。

同时,本次实验将实验要求中的需求根据MVC框架进行拆解,利用Javafx中Controller、FXML来实现MVC中的View和Controller。在Modle上,在Pcap4j框架的基础上,设计PacketModel类,在View和Controlle层中进行数据共享和通信。

基本框架

针对上面的需求分析和MVC框架,对主要功能进行罗列,对用户的操作进行判断,以此规划出JSniffer的基本流程图。JSniffer的基本流程图如图:

其中根据Pcap4j的官方手册,开发者可以利用Pcap4j中的Packet Factory机制,通过继承org.pcap4j.packet.AbstractPacket类和实现org.pcap4j.packet.Packet interface类的方式,来添加数据包协议,以便于数据包的拆解和分析。此外,pcap4j中的Packet Factory的设计如图:

具体实现

JSniffer的项目目录和相关解释,如下:

├── java
│   ├── module-info.java # 提供项目中使用的库信息,便于gradle打包
│   └── xyz 
│       └── xzaslxr
│           └── jsniffer
│               ├── SnifferApplication.java # 主要应用
│               ├── controller
│               │   ├── MainController.java # 控制主要界面
│               │   └── StatisticsController.java # 控制统计界面
│               └── utils
│                   ├── PacketModel.java # JSniffer的数据模型
│                   └── Sniffer.java # 相关底层函数和类
└── resources
    └── xyz
        └── xzaslxr
            └── jsniffer
                ├── main-view.fxml # 主要界面
                └── statistics-view.fxml # 统计界面

界面设计

在界面设计上,根据分为嗅探应用和统计应用这两个主要功能将界面也划分为主要界面和统计界面。主要界面中负责控制嗅探、处理BPF查询语句、保存文件、打开文件、展示嗅探结果和数据包具体信息等功能。统计界面主要通过应用中共享的数据模型,来统计文件中的数据包或通过嗅探获得的数据包信息,主要按时间对数据包的增长进行分析,以及数据包中协议类型和数量间的关系。主要界面和统计界面的相关设计如下:

  • 主要界面
  • 统计界面

模型设计

在模型设计上,除了与主要界面相关的基本数据外,如idtimesrcdstprotocollength外,根据需求设计streamStringitemPacket

streamString 参数的作用主要在初始化数据包时,可以计算出类似Wireshark中的StreamId,从而达到完整显示请求从发起到结束的交互过程,并对主要界面的TableView中的TableRaw进行标色,以便于与其他数据相区分。

itemPacket 参数的作用是存储当前获取数据包的原始信息,以便于控制层中进行分析。在控制层中,根据已加载到Packet Factory中的网络协议包,解析当前的数据包,并利用主要界面中的Treeview进行展示,从而做到解析数据包并合适展示的功能。

控制设计

控制层设计上,采用JavaFX中的FXML的设计,将View部分和Controller部分进行分离,以便于开发设计,如statistics-view.fxmlStatisticsController控制类进行关联。同时,对于View层的事件监听,为了快速和安全的响应,多采用setOnActionaddListener结合的方式来实现callback功能,如当嗅探器底层获取新的设计包时,会自动调用addListener中的onChanged监听器,来自动刷新界面。

在嗅探器底层上,多采用函数式编程,参数主要来自于MainController和PacketModel。在嗅探器的底层实现上,采用Pcap4j中PcapHandle添加PacketListener的方式,来自动获取和保存数据包,以用于其他环节,如数据包分析和数据包统计。在解析数据包上,利用Packet Factory中的定义好的协议类来进行分析,如ArpPacket类中定义了ArpHeader,来对数据包中的Arp信息进行解析,ArpHeader中采用的RFC中的定义如下。

    /*
     *  0                            15
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |         Hardware Type         |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |         Protocol Type         |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |  HW Addr Len  |Proto Addr Len |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |         Operation             |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |    Src Hardware Address       |
     * +                               +
     * |                               |
     * +                               +
     * |                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |    Src Protocol Address       |
     * +                               |
     * |                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |    Dst Hardware Address       |
     * +                               +
     * |                               |
     * +                               +
     * |                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |    Dst Protocol Address       |
     * +                               |
     * |                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     */

此外,与其他工具对比,JSniffer支持在嗅探器运行时、嗅探器运行后、打开数据包文件这三种状态下,设置BPF过滤器和渲染界面。该功能主要通过合理控制全局变量PcapHandle runpcapHandleObservableList<PacketModel> packetsTable的更新,以及利用bpfProgram.applyFilter(packet)进行判断。

测试分析

基本使用

JSniffer可在网卡下拉栏选择网卡,选择开启嗅探,或选择打开pcap文件进行分析,也支持保存嗅探得到的数据包。

在运行上,JSniffer支持gradle工具来进行运行或编译,如./gradlew run可直接运行项目,./gradlew shadowJar则是利用shadowJar插件进行Jar打包,之后通过java -jar build/libs/JSniffer-1.0-all.jar进行运行。

软件测试

在测试分析环节,JSniffer支持利用gradle来直接运行或编译为Jar文件,两种方式均在windows x64和 macos aarch64上成功运行,图为两个平台的上的运行截图,都支持嗅探、过滤器设置、跟踪数据包、打开和保存文件以及数据统计功能。

  • mac
  • windows

总结

总体来说,JSniffer的实现满足了实验的要求,提供了一个易于使用的网络嗅探工具,可以在多个平台上运行,并且支持多种协议解析和BPF过滤器。此外,JSniffer还提供了数据包统计功能,使用者可以更好地了解网络流量的情况。在实现上,JSniffer采用了MVC框架,这使得代码的组织和维护变得更加容易。同时,利用Pcap4j中的Packet Factory机制来添加数据包协议,使得JSniffer可以支持更多的协议解析。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇