基于C++ WinPcap 的网络抓包软件

♻️ 资源

大小: 659KB

➡️ 资源下载: https://download.csdn.net/download/s1t16/87453202

基于 WinPcap 的网络抓包软件

概要设计

一、概述

  • 项目名称:网络抓包软件设计
  • 项目成员:
  • 项目描述:目前,有许多流行的网络抓包软件可以获取流经网卡的数据包(ethereal, sniffer),这个题目要求学生利用 winpcap 库设计并实现一个网络抓包的原型系统。
  • 项目目标:实现一个网络抓包系统
  • 项目功能
    1. 搜索并显示所有的网卡设备
    2. 根据所选网卡进行抓包操作,并显示数据包的基本
      信息,eg:类型、时间、IP 地址等信息
    3. 对数据包进行详细分析,显示数据内容

二、系统结构设计

三、接口设计

用户界面
模块间的接口

详细设计

控制部分

  • CMainFrame 主框架类
    • BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
      此函数创建了包含 3 个视图的分隔窗体
    • void CMainFrame::OnSelectstart()
      点击了"开始"工具栏按钮, 弹出 CDevSelector 选中设备进行抓包
    • void CMainFrame::OnEndcatch()
      点击了"终止"工具栏按钮, pcap_breakloop 正在监听的设备
    • void CMainFrame::OnTExit(int exitNum)
      得到线程退出前发出的 WM_TEXIT 消息, 可以安全地释放各种资源了
    • void CMainFrame::OnUpdateXXX(CCmdUI* pCmdUI)
      开始、终止、打开、保存、另存为 按钮/菜单 的使能转换
  • CDevSelector 网卡设备选择
    • void CDevSelector::InitWinPcap()
      CDevSelector 初始化的时候获取设备列表
    • BOOL CDevSelector::OnInitDialog()
      对话框初始化时调用 InitWinPcap
    • void CDevSelector::OnOK()
      点击了对话框的"确定"按钮, pcap_open 选中的设备
  • CSimpleSnifferApp 主程序类
    • void CSimpleSnifferApp::startCatch()
      启动线程, 开始抓包
  • CSimpleSnifferDoc 文档类
    • void CSimpleSnifferDoc::Serialize(CArchive& ar)
      串行化中实现 保存/打开 逻辑

抓包线程

  • UINT ThreadProc(LPVOID param)
    抓包线程体,用 pcap_loop 循环抓包
  • static void packet_handler(u_char param, const struct pcap_pkthdr header, const u_char *pkt_data)
    pcap_loop 捕获到一个包后将包数据复制一份 并 发出 WM_TCATCH 消息
  • class ThreadParam
    封装传给线程的参数

分隔视图

  • CInfoView 包信息列表
    • void CInfoView::OnTCatch(struct pcap_pkthdr *header, u_char *pkt_data)
      处理抓包线程抓到包的事件, pkt_data 是抓到的包
    • void CInfoView::OnClick(NMHDRpNMHDR, LRESULT pResult)
      点击列表中某行后, 显示它的包类型、16 进制形式的包数据
    • void CInfoView::clearList()
      清空列表, 开始新的抓包前调用这个这个函数
  • CPackInfo 各层协议单元详细信息
    • void CPackInfo::ShowPackInfo(const CString& info)
      在编辑区中显示一段字符串
  • Hex 提供 16 进制显示的接口
    • virtual void ShowHexText(char *data, int len)=0;
      以十六进制形式显示 data 之后的 len 个字节
  • CHexView Hex 接口的实现
    • void CHexView::ShowHexText(char *data, int len)
      显示十六进制信息

解析包

class Head_Super 解析包的类,所有包都派生自这个类

class Head_Super{

public:

// 指向更高层协议

Head_Super* next;

// 从 pkt_data 中抽取出这层协议 PDU 的信息

virtual void analysis(u_char *pkt_data)=0;

// 将这层协议的详细信息以一个字符串表现出来

virtual CString my_print()=0;

};

class Info 保存了抓到的一个包的所有信息

class Info{

public:

struct pcap_pkthdr *header; //抓包所得数据包一些信息(时间、长度)

u_char *pkt_data; //抓包所得数据包内容头指针

Head_Super* m_Head; //最底层协议的 PDU

};

class Head_XXX

Head_Super 具体于某种协议的实现

测试文档

相关截图


相关截图

无网络活动的 启动 和 终止
有网络活动的 启动 和 终止
相关推荐
whitelbwwww26 分钟前
c++运行RKNN
开发语言·c++
LabVIEW开发28 分钟前
使用 LabVIEW 获取文件的创建日期:从内置函数到 Windows API 封装
网络·windows·labview·labview知识·labview功能·labview程序
DevOpenClub34 分钟前
全球区域与 IP 定位工作台案例方案
大数据·网络·网络协议·tcp/ip
布莱克60534 分钟前
栈(Stack)详解:定义、作用、应用场景及与队列的区别(附 C/C++ 代码)
c语言·开发语言·c++·
zmzb010335 分钟前
C++课后习题训练记录Day203
开发语言·c++
wuyk55536 分钟前
从零吃透 Modbus 通信|第 6 章:线圈功能码 05/0F 实现 & Modbus‑TCP 基础入门
c语言·网络·网络协议·tcp/ip
NJCloud1 小时前
Docker 私有仓库部署:Registry、加密传输与认证鉴权
运维·网络·docker·云原生·容器
Dream Cosmos1 小时前
Linux 多线程——线程互斥:从抢票问题到 Mutex 底层原理
linux·c++