一步一步开发sniffer(Winpcap+MFC)(一)工欲善其事,必先配环境——配置winpcap开发环境

0、说在前面的话

1) 本文将以一个初学者的角度,一步一步几乎是从0开始讲述如何完成一个基于winpcap+MFC的sniffer(嗅探器)当然我指的“0”并不是指连编程都不会,如果C/C++不知为何物那么还是别看这篇文章了,本文只有那么几点小小要求:

         a.懂基本的编程语法,只会java的没关系,语言这东西语法差别不大,看着看着就懂了

         b.懂一点点网络知识,起码知道OSI七层网络模型或者TCP/IP四层(也有说五层的)网络模型

         c. 想学怎么做一个sniffer,而不是想来这里down代码,这种代码CSDN下载里多得是,不用来这里了

2) 本文里的程序不是最优秀的,不是最牛的,甚至不知道能不能算作优秀,所以牛人可以略过此文,此文是给那些想开发但又不会开发,懂那么一点点又其实不太懂的人看的(写这个程序之前,我在MFC方面也算是这一类人:)

3)  本文不讨论专业、学术内容,什么架构之类的都不在讨论范围之类,一切以实用为主,一切以开发出一个sniffer为核心

4) 本文主要内容:

            a.工欲善其事,必先配环境——配置winpcap开发环境

      b.掀起你的盖头来,让我来画你的脸——用MFC开发GUI

    c.安得广厦千万间,先画蓝图再砌砖——搭建wipcap抓包框架

      d.要想从此过,留下协议头——各层网络协议头的实现

      e.莫道无人能识君,其实我懂你的心——解析数据包

      f.千呼万唤始出来,不抱琵琶也露面——将解析数据写到GUI 

5)来看看我们要做的最终成果: 

   功能:

      列出监测主机的所有网卡,选择一个网卡,在混杂模式下进行监听。

      捕获所有流经网卡的数据包,并利用WinPcap函数库设置过滤规则。

      可以本地文件形式保存和读取已捕获的数据包信息。

      分析捕获到的数据包的包头和数据,按照各种协议的格式进行格式化显示。

      支持协议包括:IPv4、IPv6、ARP、ICMP、TCP、UDP、HTTP。  

  界面:

   一、工欲善其事,必先配环境——配置winpcap开发环境

        1.0、背景

        WinPcap(Windows Packet Capture)是Windows平台下的链路层网络访问工具,其目的在于为Windows应用程序提供访问网络底层的能力。需要注意的是WinPcap只能把数据包从网络中抓过来(其实是复制过来,并没有真实的抓过来,感觉像是拍了张照),并不能修改数据。

        “那么在哪里可以买得到呢?”,其实不用买,要得到很容易,更何况咱中国人没有为软件付费的习惯:),参看下一节,“不可或缺的东西”:

        1.1、不可或缺的东西

WinPcap V4.1.2:驱动程序、Dll文件

http://www.winpcap.org/install/bin/WinPcap_4_1_2.exe

WinPcap V4.1.2 Developer’s Pack:库文件、头文件、简单的示例程序代码和帮助文件

        http://www.winpcap.org/install/bin/WpdPack_4_1_2.zip

当然还有VisualStudio2008或者VC++6.0,本文用的是VS2008

        (这玩意的下载网址就不用我介绍了吧)

1.2、配置过程

l 添加头文件目录

VS2008:

        工具->属性->项目和解决方案-> VC++目录->包含文件->添加WinPcap开发包中的Include目录,如下图:

        

VC6:

         Tools->Options->Derectories->Include files->添加WinPcap开发包中的Include目录,如下图:

 

l 添加库文件目录

VS2008:

与上一个步骤一样,只有一小个变化,选择“库文件”,然后添加WinPcap开发包中的Lib目录,如下图:

 

VC6:

       Tools->Options->Derectories->Library files->添加WinPcap开发包中的Lib目录,如下图:

       

l 增加与WinPcap有关的预处理定义

VS2008:

        项目->项目属性->配置属性->预处理定义->添加WPCAPHAVE_REMOTE,如下图:

 

                  VC6:

       Project->Setting->C/C++->Preprocessor->添加WPCAPHAVE_REMOTE,如下图:

 

l 添加wpcap.lib库文件

                            VS2008

    项目->项目属性->配置属性->连接器->命令行->附加选项框中加入wpcap.lib,如下图: 

  

VC6:

                        Project->setting->link->加入wpcap.lib,如下图:

         

l 添加pcap.h头文件

在使用WinPcap API的所有源文件中添加#include "pcap.h”

1.3、       运行测试代码

所有配置工作全部搞定,现在来运行测试代码,如果能顺利执行,那么就配置成功了。

这里的测试代码其实就是WinPcap中自带的实例,还记得“不可或缺的文件”中下载的两个文件没?从WpdPack_4_1_2.zip解压出来的文件中有Examples-pcap和Examples-remote两个文件夹,进入Examples-pcap中可以看到,里面有很多实例,任意打开一个文件夹,打开其中的.dsw文件,执行一下就知道了。

笔者这里选择的是UDPdump这个实例,执行成功的画面如下: 

 

 第一章至此结束,欲知后事如何,请看下一章“起你的盖头来,让我来画你的脸——用MFC开发GUI”分解!


为了方便学习,完整的代码下载在这里:http://download.csdn.net/download/litingli/4110529

 

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于MFC+WinPcap的网络嗅探器的实现步骤: 1. 创建MFC对话框应用程序。 2. 下载和安装WinPcap库,并将其添加到项目中。 3. 在对话框中添加一个列表框控件,用于显示捕获到的数据包。 4. 在对话框头文件中包含WinPcap库的头文件pcap.h,并定义一个pcap_t类型的变量用于打开网络适配器。 5. 在OnInitDialog()函数中初始化WinPcap库,并打开网络适配器。 6. 创建一个线程来捕获数据包,在线程函数中使用pcap_loop()函数来持续捕获数据包,并将捕获到的数据包添加到列表框中。 7. 在OnDestroy()函数中关闭网络适配器和WinPcap库。 以下是基于MFC+WinPcap的网络嗅探器的代码示例: ```cpp #include "stdafx.h" #include "MySnifferDlg.h" #include "afxdialogex.h" #include <pcap.h> #ifdef _DEBUG #define new DEBUG_NEW #endif // CMySnifferDlg 对话框 CMySnifferDlg::CMySnifferDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_MYSNIFFER_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMySnifferDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_PACKETS, m_listPackets); } BEGIN_MESSAGE_MAP(CMySnifferDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_DESTROY() END_MESSAGE_MAP() // CMySnifferDlg 消息处理程序 BOOL CMySnifferDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 初始化WinPcap库 char errbuf[PCAP_ERRBUF_SIZE]; pcap_t* pcapHandle = pcap_open_live("\\Device\\NPF_{E908B419-FF05-408B-B4F6-8E82FBC3D16D}", // 网络适配器名称 65536, // 数据包最大长度 1, // 混杂模式 1000, // 超时时间(毫秒) errbuf); // 错误信息缓冲区 if (pcapHandle == NULL) { AfxMessageBox(_T("打开网络适配器失败!")); return TRUE; } // 开始捕获数据包 AfxBeginThread(CaptureThreadProc, (LPVOID)pcapHandle); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMySnifferDlg::OnDestroy() { CDialogEx::OnDestroy(); // TODO: 在此处添加消息处理程序代码 // 关闭WinPcap库和网络适配器 pcap_t* pcapHandle = (pcap_t*)GetWindowLongPtr(GetSafeHwnd(), GWLP_USERDATA); pcap_close(pcapHandle); } void CMySnifferDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } HCURSOR CMySnifferDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } UINT CMySnifferDlg::CaptureThreadProc(LPVOID lpParam) { pcap_t* pcapHandle = (pcap_t*)lpParam; // 定义捕获数据包时的回调函数 void packetHandler(u_char* userData, const struct pcap_pkthdr* pkthdr, const u_char* packetData) { CMySnifferDlg* pThis = (CMySnifferDlg*)userData; // 将捕获到的数据包添加到列表框中 CString strPacket; strPacket.Format(_T("Packet size: %d bytes"), pkthdr->len); pThis->m_listPackets.AddString(strPacket); } // 开始捕获数据包 pcap_loop(pcapHandle, 0, packetHandler, (u_char*)AfxGetApp()->m_pMainWnd); return 0; } ``` 注意:上述代码中的网络适配器名称需要根据实际情况修改。可以使用WinPcap提供的pcap_findalldevs()函数来获取可用的网络适配器列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值