过滤数据包

过滤数据包

 
WinPcap和Libpcap的最强大的特性之一,是拥有过滤数据包的引擎。 它提供了有效的方法去获取网络中的某些数据包,这也是WinPcap捕获机制中的一个组成部分。 用来过滤数据包的函数是 pcap_compile() pcap_setfilter()

pcap_compile() 它将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码。有关布尔过滤表达式的语法可以参见 Filtering expression syntax 这一节的内容。

pcap_setfilter() 将一个过滤器与内核捕获会话向关联。当 pcap_setfilter() 被调用时,这个过滤器将被应用到来自网络的所有数据包,并且,所有的符合要求的数据包 (即那些经过过滤器以后,布尔表达式为真的包) ,将会立即复制给应用程序。

以下代码展示了如何编译并设置过滤器。 请注意,我们必须从 pcap_if 结构体中获得掩码,因为一些使用 pcap_compile() 创建的过滤器需要它。

在这段代码片断中,传递给 pcap_compile() 的过滤器是"ip and tcp",这说明我们只希望保留IPv4和TCP的数据包,并把他们发送给应用程序。

    if (d->addresses != NULL)
        /* 获取接口第一个地址的掩码 */
        netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
    else
        /* 如果这个接口没有地址,那么我们假设这个接口在C类网络中 */
        netmask=0xffffff; 


compile the filter
    if (pcap_compile(adhandle, &fcode, "ip and tcp", 1, netmask) < 0)
    {
        fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
        /* 释放设备列表 */
        pcap_freealldevs(alldevs);
        return -1;
    }
    
set the filter
    if (pcap_setfilter(adhandle, &fcode) < 0)
    {
        fprintf(stderr,"\nError setting the filter.\n");
        /* 释放设备列表 */
        pcap_freealldevs(alldevs);
        return -1;
    }

如果你想阅读过滤函数的范例代码,请阅读下一讲 分析数据包的例子。

 
WinPcap和Libpcap的最强大的特性之一,是拥有过滤数据包的引擎。 它提供了有效的方法去获取网络中的某些数据包,这也是WinPcap捕获机制中的一个组成部分。 用来过滤数据包的函数是 pcap_compile() pcap_setfilter()

pcap_compile() 它将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码。有关布尔过滤表达式的语法可以参见 Filtering expression syntax 这一节的内容。

pcap_setfilter() 将一个过滤器与内核捕获会话向关联。当 pcap_setfilter() 被调用时,这个过滤器将被应用到来自网络的所有数据包,并且,所有的符合要求的数据包 (即那些经过过滤器以后,布尔表达式为真的包) ,将会立即复制给应用程序。

以下代码展示了如何编译并设置过滤器。 请注意,我们必须从 pcap_if 结构体中获得掩码,因为一些使用 pcap_compile() 创建的过滤器需要它。

在这段代码片断中,传递给 pcap_compile() 的过滤器是"ip and tcp",这说明我们只希望保留IPv4和TCP的数据包,并把他们发送给应用程序。

    if (d->addresses != NULL)
        /* 获取接口第一个地址的掩码 */
        netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
    else
        /* 如果这个接口没有地址,那么我们假设这个接口在C类网络中 */
        netmask=0xffffff; 


compile the filter
    if (pcap_compile(adhandle, &fcode, "ip and tcp", 1, netmask) < 0)
    {
        fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
        /* 释放设备列表 */
        pcap_freealldevs(alldevs);
        return -1;
    }
    
set the filter
    if (pcap_setfilter(adhandle, &fcode) < 0)
    {
        fprintf(stderr,"\nError setting the filter.\n");
        /* 释放设备列表 */
        pcap_freealldevs(alldevs);
        return -1;
    }

如果你想阅读过滤函数的范例代码,请阅读下一讲 分析数据包的例子。

### Wireshark 中通过端口过滤数据包的方法 在 Wireshark 中,可以通过设置捕获过滤器或显示过滤器来实现对特定端口的数据包进行过滤。以下是具体的操作方式: #### 设置捕获过滤器 如果希望仅捕获指定端口的数据包,则可以在启动抓包之前配置捕获过滤器。例如: - **单个端口**:`tcp port 80` 或 `udp port 80` 表示只捕获 TCP 或 UDP 协议下目标端口或源端口为 80 的数据包[^3]。 - **多个端口**:可以使用逻辑运算符组合多个条件,如 `tcp.port eq 80 or tcp.port eq 443` 表示捕获 TCP 协议下的 80 和 443 端口的数据包。 - **端口范围**:对于连续的端口范围,可以使用表达式 `tcp.port >= 1 and tcp.port <= 80` 来限定捕获范围内的端口数据包。 #### 配置显示过滤器 如果已经完成了全量数据包的捕获,但只想查看某些端口的相关数据包,则可以利用显示过滤器功能。操作步骤如下: 1. 打开已保存的 pcap 文件或者实时抓取中的窗口; 2. 在顶部的过滤框中输入相应的过滤规则,比如 `tcp.port == 80` 或者更复杂的组合条件; 3. 按回车键执行过滤,界面会自动隐藏不符合条件的数据包。 需要注意的是,上述提到的所有语法均适用于 Wireshark 抓包前后的场景,因此无论是预先设定还是后期处理都能满足需求[^1]。 ```python # 示例 Python 脚本模拟简单的端口过滤逻辑(伪代码) def filter_packets_by_port(packets, target_ports): filtered = [] for packet in packets: if packet['protocol'] == 'TCP' and packet['port'] in target_ports: filtered.append(packet) return filtered target_ports = [80, 443] packets = [...] # 假设这是从 wireshark 导入的一个列表对象 filtered_packets = filter_packets_by_port(packets, target_ports) print(filtered_packets) ``` #### 实际案例解析 假设现在有一款名为“疯狂聊天室”的应用程序正在运行于 Windows 10 主机与 Ubuntu 虚拟机之间,并且我们怀疑它使用的可能是 TCP 或者 UDP 协议来进行通信。那么按照前面介绍的技术手段,我们可以先尝试分别监听常见的服务端口号(如 HTTP 默认的 80),再逐步调整至其他可能性较大的区间直至定位确切的服务参数为止[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值