MFC+WinPcap编写一个嗅探器之六(分析模块)

这一节是程序的核心,也是最复杂的地方

首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程。本程序中除了界面线程外,抓包需要另外创建一个新的线程。在写抓包函数之前,首先要将前面两个模块的结果返回到主对话框界面对应的类实现中,在SnifferDlg.cpp中,修改之前增加的两个模块的触发函数如下:

1 void CSnifferDlg::OnAdp()
2 {
3     // TODO: 在此添加命令处理程序代码
4     CAdpDlg adpdlg;
5     if(adpdlg.DoModal() == IDOK)
6     {
7         m_pDevice = adpdlg.returnd();
8     }
9 }
 1 void CSnifferDlg::OnFilter()
 2 {
 3     // TODO: 在此添加命令处理程序代码
 4     CFilterDlg filterdlg;
 5     if(filterdlg.DoModal() == IDOK)
 6     {
 7         int len =WideCharToMultiByte(CP_ACP,0,filterdlg.GetFilterName(),-1,NULL,0,NULL,NULL);
 8         WideCharToMultiByte(CP_ACP,0,filterdlg.GetFilterName(),-1,m_filtername,len,NULL,NULL );
 9
10     }
11 }

前一个函数是在打开选择适配器窗口后,在用户选择完网卡后,将选择的网卡返回到主界面的类实现中;后一个函数是在打开设置过滤规则后,将过滤规则的字符串返回到主界面的类实现中。也许你对第二个函数中的两个函数不太明白,这是一个宽字符转换为多字符的函数,就只需了解其中两个参数即可,其它的复制粘贴,函数是这样使用的。获得了前两个模块的返回值,就可以来写抓包函数了,创建一个新线程,抓包函数代码如下:

 1 DWORD WINAPI CapturePacket(LPVOID lpParam)
 2 {
 3     CSnifferDlg *pDlg = (CSnifferDlg *)lpParam;
 4     pcap_t *pCap;
 5     char    strErrorBuf[PCAP_ERRBUF_SIZE];
 6     int res;
 7     struct pcap_pkthdr *pkt_header;
 8     const u_char *pkt_data;
 9     u_int netmask;
10     struct bpf_program fcode;
11
12     if((pCap=pcap_open_live(pDlg->m_pDevice->name,65536,PCAP_OPENFLAG_PROMISCUOUS,1000,strErrorBuf))==NULL)
13     {
14         return -1;
15     }
16
17     if(pDlg->m_pDevice->addresses != NULL)
18         /* 获得接口第一个地址的掩码 */
19         netmask=((struct sockaddr_in *)(pDlg->m_pDevice->addresses->netmask))->sin_addr.S_un.S_addr;
20     else
21         /* 如果接口没有地址,那么我们假设一个C类的掩码 */
22         netmask=0xffffff;
23         //编译过滤器
24         if (pcap_compile(pCap, &fcode,pDlg->m_filtername, 1, netmask) <0 )
25         {
26             AfxMessageBox(_T("请设置过滤规则"));
27             return -1;
28         }
29         //设置过滤器
30         if (pcap_setfilter(pCap, &fcode)<0)
31             return -1;
32
33     while((res = pcap_next_ex( pCap, &pkt_header, &pkt_data)) >= 0)
34     {
35
36         if(res == 0)
37             continue;
38         if(!pDlg->m_bFlag)
39             break;
40         CSnifferDlg *pDlg = (CSnifferDlg *)AfxGetApp()->GetMainWnd();
41         pDlg->ShowPacketList(pkt_header,pkt_data);
42         pDlg = NULL;
43     }
44
45     pcap_close(pCap);
46     pDlg = NULL;
47     return 1;
48 }

解释两个地方,一是怎样控制开始抓包和停止抓包,这里采用了一个bool变量m_bFlag,这个变量初值是FALSE,当点击菜单中的开始捕获变量为true,点击停止捕获变量又变为false。二是当抓完一个包后,又将指针指向主界面的句柄,之后将抓来的数据包的内容在主界面中显示。

主界面中有三个需要显示抓包内容的地方,一是数据包的概略信息,用ShowPacketList函数来实现;二是数据包的详细信息用ShowPacketTree函数来实现;三是数据包的具体内容和统计信息。这三部分是大量相似的代码,主要涉及到对网络协议的分析,用到的主要是判断语句,放到下一节讲吧。

下一节 MFC+WinPcap编写一个嗅探器之七(协议)

时间: 2024-12-25 03:45:36

MFC+WinPcap编写一个嗅探器之六(分析模块)的相关文章

MFC+WinPcap编写一个嗅探器之五(过滤模块)

这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规则字符串,根据WinPcap的要求,合法的过滤规则可以是如下几种: 1) 表达式支持逻辑操作符,可以使用关键字 and.or.not对子表达式进行组合,同时支持使用小括号.2) 基于协议的过滤要使用协议限定符,协议限定符可以为ip.arp.rarp.tcp.udp等.3) 基于MAC地址的过滤要使用

MFC+WinPcap编写一个嗅探器之四(获取模块)

这一节主要介绍如何获取设备列表,比较简单 获取设备列表主要是在CAdpDlg中完成,也就是对应之前创建的选择适配器模块,如图: 当打开选择适配器对话框后,在列表视图控件中显示当前主机所有适配器及适配器的描述,当选中一个适配器时,在下方的编辑框中会显示当前选中的适配器,单击绑定会提示网卡绑定成功. 本节中代码都在AdpDlg.cpp中完成,当然变量的声明要在其对应的头文件中去做,这里就不再叙述. 首先要获取设备列表,在OnInitDialog函数中加入如下代码: 1 if (pcap_findal

从头开始编写一个Orchard网上商店模块(6) - 创建购物车服务和控制器

原文地址: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-6创建购物车服务和控制器 这是从头开始编写一个新的Orchard模块的教程的第6篇.对于本教程的概述,请参阅介绍. 在本篇,我们将使我们的用户可以添加商品到他们的购物车.要创建这样的功能,我们需要: 一个“添加到购物车”按钮,要被添加我们的产品目录上,将产品添加到购物车 某种购物车服务,以存储

从头开始编写一个Orchard网上商店模块(5) - 创建和渲染ProductCatalog的内容类型

原文地址: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-5创建和渲染ProductCatalog的内容类型 这是从头开始编写一个新的Orchard模块的教程的第5篇.对于本教程的概述,请参阅介绍. 为了网站的访问者能够将产品添加到他们的购物车,我们需要一个产品目录.产品目录可以是一个简单的产品清单.然而,在本教程中,我们希望主题作者能够接管渲染(r

从头开始编写一个Orchard网上商店模块(3) - 创建Orchard.Webshop模块项目

原文地址:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-3创建Orchard.Webshop模块项目 这是从头开始编写一个新的Orchard模块的教程的第3篇.对于本教程的概述,请参阅介绍. Orchard模块是一个真正的ASP.NET MVC的Area类库,同时遵循了ASP.NET MVC和Orchard的特定的规范.Orchard 规范提升了您的

手把手教你编写一个简单的PHP模块形态的后门

看到Freebuf 小编发表的用这个隐藏于PHP模块中的rootkit,就能持久接管服务器文章,很感兴趣,苦无作者没留下PoC,自己研究一番,有了此文 0×00. 引言 PHP是一个非常流行的web server端的script语言.目前很多web应用程序都基于php语言实现.由于php是个开源软件并易于扩展,所以我们可以通过编写一个PHP模块(module 或者叫扩展 extension)来实现一个Backdoor. 本文就简单介下如何一步步编写一个简单的php 动态扩展后门. 0×01. p

Golang中使用heap编写一个简单高效的定时器模块

定时器模块在服务端开发中非常重要,一个高性能的定时器模块能够大幅度提升引擎的运行效率.使用Golang和heap实现一个通用的定时器模块,代码来自:https://github.com/xiaonanln/goTimer 也可以查看文档:http://godoc.org/github.com/xiaonanln/goTimer,下面是完整的代码,并进行适当的注释和分析. 从性能测试结果来看,基于heap的定时器模块在效率上并不会比时间轮(TimeWheel)的实现慢多少,但是逻辑上要简单很多.

python编写网络抓包分析脚本

python编写网络抓包分析脚本 写网络抓包分析脚本,一个称手的sniffer工具是必不可少的,我习惯用Ethereal,简单,易用,基于winpcap的一个开源的软件 Ethereal自带许多协议的 decoder,但是它的架构并不灵活,如果你要加入一个自己定义的的解码器,得去修改Ethereal的代码,再重新编译,相当的烦琐 对于一般的明文协议,没有什么问题,但是对于加密协议,比如网络游戏,客户端程序一般会在刚连接上的时候,发送一个随机密钥,而后的报文都会用这个密钥进 行加密,诸如此类.要想

使用Python编写一个渗透测试探测器

本篇将会涉及: 资源探测 一个有用的字典资源 第一个暴力探测器 资源探测 资源探测在渗透测试中还是属于资源的映射和信息的收集阶段. 主要有以下三个类型: 字典攻击 暴力破解 模糊测试 字典攻击,在破解密码或密钥的时候,通过自定义的字典文件,有针对性地尝试字典文件内所有的字典组合. 暴力破解,也叫做穷举法,按照特定的组合,进行枚举所有的组合.简单来说就是将密码进行逐个推算直到找出真正的密码为止. 模糊测试,指通过向目标系统提供非预期性的输入并监视其发生的异常结果来发现目标系统的漏洞. 资源探测的作