♻️ 资源
大小: 659KB
➡️ 资源下载: https://download.csdn.net/download/s1t16/87453202
基于 WinPcap 的网络抓包软件
概要设计
一、概述
- 项目名称:网络抓包软件设计
- 项目成员:
- 项目描述:目前,有许多流行的网络抓包软件可以获取流经网卡的数据包(ethereal, sniffer),这个题目要求学生利用 winpcap 库设计并实现一个网络抓包的原型系统。
- 项目目标:实现一个网络抓包系统
- 项目功能
-
- 搜索并显示所有的网卡设备
- 根据所选网卡进行抓包操作,并显示数据包的基本
信息,eg:类型、时间、IP 地址等信息 - 对数据包进行详细分析,显示数据内容
二、系统结构设计

三、接口设计
用户界面

模块间的接口

详细设计
控制部分
- 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)
开始、终止、打开、保存、另存为 按钮/菜单 的使能转换
- BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
- CDevSelector 网卡设备选择
-
- void CDevSelector::InitWinPcap()
CDevSelector 初始化的时候获取设备列表 - BOOL CDevSelector::OnInitDialog()
对话框初始化时调用 InitWinPcap - void CDevSelector::OnOK()
点击了对话框的"确定"按钮, pcap_open 选中的设备
- void CDevSelector::InitWinPcap()
- CSimpleSnifferApp 主程序类
-
- void CSimpleSnifferApp::startCatch()
启动线程, 开始抓包
- void CSimpleSnifferApp::startCatch()
- CSimpleSnifferDoc 文档类
-
- void CSimpleSnifferDoc::Serialize(CArchive& ar)
串行化中实现 保存/打开 逻辑
- 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()
清空列表, 开始新的抓包前调用这个这个函数
- void CInfoView::OnTCatch(struct pcap_pkthdr *header, u_char *pkt_data)
- CPackInfo 各层协议单元详细信息
-
- void CPackInfo::ShowPackInfo(const CString& info)
在编辑区中显示一段字符串
- void CPackInfo::ShowPackInfo(const CString& info)
- Hex 提供 16 进制显示的接口
-
- virtual void ShowHexText(char *data, int len)=0;
以十六进制形式显示 data 之后的 len 个字节
- virtual void ShowHexText(char *data, int len)=0;
- CHexView Hex 接口的实现
-
- void CHexView::ShowHexText(char *data, int len)
显示十六进制信息
- 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 具体于某种协议的实现
测试文档

相关截图


相关截图
无网络活动的 启动 和 终止


有网络活动的 启动 和 终止

