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

这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤

设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图:

首先要根据用户的选择来生成一个合法的过滤规则字符串,根据WinPcap的要求,合法的过滤规则可以是如下几种:

1) 表达式支持逻辑操作符,可以使用关键字 and、or、not对子表达式进行组合,同时支持使用小括号。
2) 基于协议的过滤要使用协议限定符,协议限定符可以为ip、arp、rarp、tcp、udp等。
3) 基于MAC地址的过滤要使用限定符ether(代表以太网地址)、当该MAC地址仅作为源地址时表达式为ether src mac_addr,仅作为目的地址时,表达式为ether dst mac_addr,既作为源地址又作为目的地址时的表达式为ether host mac_addr。此外应注意mac_addr应该遵从00:E0:4C:E0:38:88的格式,否则编译过滤器时会出错。
4) 基于IP地址的过滤应该使用限定符host(代表主机地址)。当该IP地址仅作为源地址时过滤表达式应为 src host ip_addr,仅作为目的地址时的表达式为 dst host ip_addr,既作为源地址又作为目的地址时表达式为 host ip_addr。
5) 基于端口的过滤应使用限定符 port。例如仅接收80端口的数据包则表达式为port 80。

下边给出两个例子:
例1:只捕获arp或icmp数据包。
过滤表达式:arp or (ip and icmp)
例2:捕获主机192.168.1.23与192.168.1.28之间传递的所有UDP数据包。
过滤表达式:(ip and udp)and( host 192.168.1.23 or host 192.168.1.28)

这样可以用以下代码来生成一个合法的过滤规则:首先生成一个点击确定的触发函数,之后添加如下代码

 1 void CFilterDlg::OnBnClickedOk()
 2 {
 3     // TODO: 在此添加控件通知处理程序代码
 4     if (1 == m_tcp.GetCheck())
 5     {
 6         filtername += _T("(tcp and ip) or ");
 7     }
 8     if (1 == m_udp.GetCheck())
 9     {
10         filtername += _T("(udp and ip) or ");
11     }
12     if (1 == m_arp.GetCheck())
13     {
14         filtername += _T("arp or ");
15     }
16     if (1 == m_rarp.GetCheck())
17     {
18         filtername += _T("rarp or ");
19     }
20     if (1 == m_icmp.GetCheck())
21     {
22         filtername += _T("(icmp and ip) or ");
23     }
24     if (1 == m_igmp.GetCheck())
25     {
26         filtername += _T("(igmp and ip) or ");
27     }
28
29     filtername = filtername.Left(filtername.GetLength()-4);  //注意去掉最后多余的" or ",否则过滤规则不成立
30
31     CDialogEx::OnOK();
32
33 }

这里想补充一点关于单选框和复选框的判断是否选择的问题

判断按钮是否选中:

复选:1 == m_tcp.GetCheck()

单选和复选:不能用GetCheck()可以用通用的if (((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck())用按钮ID来选择

在默认设置时两者也有区别:

复选:m_tcp.SetCheck(1)

单选和复选:CheckDlgButton(IDC_RADIO1, 1)

也就是说复选和单选都可以通过按钮的ID来设置,而复选又多了自己的一个专门函数用来设置。

回到程序,在生成一段合法的字符串后将filtername返回给主窗口,设置和编译过滤规则的函数也在主窗口中处理,这些内容在下一节介绍吧

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

时间: 2024-10-14 03:08:55

MFC+WinPcap编写一个嗅探器之五(过滤模块)的相关文章

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

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

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

这一节是程序的核心,也是最复杂的地方 首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程.本程序中除了界面线程外,抓包需要另外创建一个新的线程.在写抓包函数之前,首先要将前面两个模块的结果返回到主对话框界面对应的类实现中,在SnifferDlg.cpp中,修改之前增加的两个模块的触发函数如下: 1 void CSnifferDlg::OnAdp() 2 { 3 // TODO: 在此添加命令处理程序代码 4 CAdpDlg adpdlg; 5 if(adpdlg.DoModal(

从头开始编写一个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

nginx 学习五 filter模块简介和实现一个简单的filter模块

1 nginx过滤模块简介 过滤(filter)模块是过滤响应头和内容的模块,可以对回复的头和内容进行处理.它的处理时间在获取回复内容之后, 向用户发送响应之前.它的处理过程分为两个阶段,过滤HTTP回复的头部和主体,在这两个阶段可以分别对头部和主体 进行修改. 2 过滤模块执行顺序 2.1 ngx_http_output_(head, body)_filter_pt 先看一下nginx常用的过滤模块,在ngx_moudles.c中有一下代码: ngx_module_t *ngx_modules

【Nginx】开发一个HTTP过滤模块

与HTTP处理模块不同.HTTP过滤模块的工作是对发送给用户的HTTP响应做一些加工. server返回的一个响应能够被随意多个HTTP过滤模块以流水线的方式依次处理.HTTP响应分为头部和包体,ngx_http_send_header和ngx_http_output_filter函数分别负责发送头部和包体.它们会依次调用各个过滤模块对待发送的响应进行处理. HTTP过滤模块能够单独处理响应的头部或者包体或同一时候处理二者.处理头部和包体的方法原型分别例如以下,它们在HTTP框架模块ngx_ht

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。

这是华为2013的一个机试题,会好半天才想出来,用了三个for循环,可能有点繁琐,但只要慢慢看还是好理解的, 题目: 通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉. 比如字符串"abacacde"过滤结果为"abcde". #include<stdio.h> #include<string.h> void main() { char a[]="aba