`
yexin218
  • 浏览: 970693 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Filter驱动:过滤(修改)接受数据包

阅读更多

Filter驱动可以实现简单的防火墙功能。它可以过滤所有接收到的包,然后进行分析处理,最后根据情况决定是否网上传递给Protocol层,最后给应用程。

我们的原则是不能在接收到的NBL修改数据,因为后面我们还会需要这个完整的包结构,尤其是在调用NdisFReturnNetBufferLists释放NBL的owership的时候。所以第一步要做的就是拷贝数据:拷贝NetBufferList数据

拷贝好了数据之后,我们需要做的是:

  1. 首先通知底层驱动,可能是Miniport driver,意思是:Filter已经收到数据,现在归还NBL的所有权,甚至说Miniport Driver可以继续往NBL写数据了。
     //Call return function to info the underlying driver of releasing ownership of NBL
            NDIS_SET_RETURN_FLAG(ReturnFlags, NDIS_RETURN_FLAGS_DISPATCH_LEVEL);
            NdisFReturnNetBufferLists(pFilter->FilterHandle, NetBufferLists, ReturnFlags);
     
  2. 其次就是把自己刚才拷贝好的数据,根据需要更改数据,比如更改port number等。
  3. 发送已经更改好的NBL
     NdisFIndicateReceiveNetBufferLists(
                pFilter->FilterHandle,
                pCopyNetBufferLists,
                PortNumber,
                NumberOfNetBufferLists,
                ReceiveFlags);
     
  4. 最后一步,别忘记了,往上发自己创建的NBL,是不能调用NdisFReturnNetBufferLists的,因为这个是Filter创建的,不是由底层发上来的,如果调用了,就会出错了。所以在FilterReturnNetBufferLists中拦截销毁自己定义的NBL,因为这是protocol已经把NBL中的数据拷贝好了~
     if(NetBufferLists->SourceHandle == pFilter->FilterHandle)
        {
            //Please just free this NBL
            ReadNetBuffer(NetBufferLists);//print out something...
            result = FreeMdlAndNetBufferList(NetBufferLists);
            if(result == TRUE)
            {
                DEBUGP(DL_TEST, ("Free my own NBL ======ReturnNetBufferLists\n"));
            }
        }
        else
        {
            NdisFReturnNetBufferLists(pFilter->FilterHandle, NetBufferLists, ReturnFlags);
        }
    
     
  5. 关于释放NBL,这里贴出来:
    BOOLEAN
    FreeMdlAndNetBufferList
    (
        PNET_BUFFER_LIST NetBufferLists
    )
    {
        BOOLEAN result = FALSE;
        PNET_BUFFER_LIST	CurrNbl,nextNbl= NULL;
        PNET_BUFFER			Currbuff;
        PMDL				mdl,pMdl;
        UINT                BufferLength;
        PUCHAR              pCopyData = NULL;
    //Free all the NBLs allocate by myself
        CurrNbl = NetBufferLists;
        while(CurrNbl)
        {
            Currbuff =NET_BUFFER_LIST_FIRST_NB(CurrNbl);
            while(Currbuff)
            {
                pMdl = NET_BUFFER_FIRST_MDL(Currbuff);
    
                FILTER_ASSERT(pMdl != NULL);
                NdisQueryMdl(
                    pMdl,
                    (PVOID *)&pCopyData,
                    &BufferLength,
                    NormalPagePriority);
                FILTER_ASSERT(pCopyData != NULL);
                NdisFreeMdl(pMdl);//Free MDL
                pCopyData = NULL;
                Currbuff = NET_BUFFER_NEXT_NB(Currbuff);
            }
            nextNbl = NET_BUFFER_LIST_NEXT_NBL(CurrNbl);//get Next MBL
            NdisFreeNetBufferList(CurrNbl);//Free CurrentNBL
            CurrNbl = nextNbl;
        }
        result =  TRUE;
        return result;
    }

展示运行结果:

首先是拷贝数据结构:

写道
00000066 10.77174854 ===============>copyNetBufferList
00000067 10.77175713 NDISLWF:
00000068 10.77176189 ==============>allocateNetBuffAndNetBufferList
00000069 10.77177429 NDISLWF:
00000070 10.77178001 <==============allocateNetBuffAndNetBufferList
00000071 10.77178478 NDISLWF:
00000072 10.77179432 newBufferLength is 231, mdlOffset is 18 and Current mdl offset 18
00000073 10.77179909 NDISLWF:
00000074 10.77180481 There are 1 NB in this list---_---
00000075 10.77180958 NDISLWF:
00000076 10.77181625 There are 1 NBLs
00000077 10.77182007 <============copyNetBufferList

 最后是往上发送的:

写道
00000079 10.77193928 ===>ReturnNetBufferLists, NetBufferLists is 890D5540.
00000080 10.77194309 NDISLWF:
00000081 10.77194786 ==============>ReadNetBuffer
00000082 10.77195263 NDISLWF:
00000083 10.77195644 ---Read From NBL: Ethernet Header info:
00000084 10.77198792 NDISLWF:
00000085 10.77200031 00-19-e0-e0-2d-30 -> 00-1d-0f-af-50-b0 Mac地址
00000086 10.77200699 NDISLWF:
00000087 10.77201366 DestIPAddr: 221.5.88.88 -> 192.168.1.105 ip地址
00000088 10.77201843 NDISLWF:
00000089 10.77202225 <==============ReadNetBuffer
00000090 10.77202702 NDISLWF:
00000091 10.77203274 Free my own NBL ======ReturnNetBufferLists销毁数据
 
分享到:
评论
1 楼 SigmaTera 2010-06-23  
         

相关推荐

    IP数据包过滤,过滤端口、黑名单、网段等

    IP分组过滤驱动.rar 驱动程序; 测试程序.rar 测试程序; /** * 规则函数: addRule(char *driver_name,USHORT type,USHORT protocol,char *sourceIp,char *sourceMask,USHORT sourcePort, char *destinationIp,...

    passthru 过滤网络数据包

    NDIS提供了一种方法,使得上层的协议驱动(如TCP/IP)可以通过NDIS与底层的网络适配器驱动进行通信,同时也允许中间层的驱动(如IPFilter)插入到这个通信链路中,对数据包进行拦截、修改或转发。 “ipfilter”标签...

    Filter驱动开发笔记

    ### NDIS Filter 驱动开发相关... Filter驱动:过滤(修改)接受数据包 - **过滤方法**:Filter驱动可以通过修改NetBufferList中的数据来实现数据包的过滤或修改。 - **应用场景**:实现防火墙、入侵检测系统等功能。

    Filter驱动开发笔记_filter_

    在Filter驱动开发中,DNIS通常用来实现网络数据包的过滤、监控或协议分析。开发者需要理解NDIS(Network Driver Interface Specification)接口,这是Windows系统中网络驱动程序开发的基础。 3. **NDIS接口**: ...

    NDIS中间层 NDIS6过滤驱动开发笔记

    在过滤驱动开发中,开发者经常需要使用数据包过滤、修改数据包、发送OID请求等技术。例如,在处理Filter发送OID请求时可能会遇到蓝屏的问题,这需要开发者仔细分析并采取适当的措施解决。同时,过滤驱动中也需要掌握...

    基于WinPcap的网络数据包捕获与分析

    WinPcap 的 NPF 抓包主要依靠两个组件:数据包过滤器(filter)和 JIT 编译器。 数据包过滤器(filter)是一个有布尔输出的函数。如果函数值是 true,抓包驱动拷贝数据包给应用程序;如果是 false,数据包将被丢弃...

    启动S7-PLCSIM Advanced V3.0时,提示网络组数据包筛选器驱动程序NPF未运行_处理办法.docx

    在使用西门子S7-PLCSIM Advanced V3.0进行模拟测试和编程时,可能会遇到一个常见的问题,即启动该软件时收到一个错误提示,指出“网络组数据包筛选器驱动程序NPF未运行”。这个错误是由于系统缺少或无法识别NPF驱动...

    libpcap编程 网络编程 网络数据包获取方法

    - **数据包过滤器**:过滤器根据预定义的规则决定是否接受数据包,以及接受的数据包部分。 5. **Libpcap库**: - `libpcap` 提供了一组用户态API,支持跨平台的数据包捕获,它与`tcpdump`紧密关联,并支持BPF过滤...

    捕获IP数据包的delphi源码

    4. **数据包过滤**:源码中可能包含了BPF(Berkeley Packet Filter)语法,这是一种强大的过滤机制,允许开发者指定捕获特定类型的数据包。例如,只捕获特定IP地址、端口或协议的数据包。 5. **IP数据包结构**:IP...

    利用WipCap捕获网络数据包并分析数据包,含源代码和工程文件,学习网络数据包捕获分析以及WinPcap的好程序

    2. 数据包过滤:用户可以设置BPF(Berkeley Packet Filter)表达式,只有满足过滤条件的数据包才会被保存和显示。 3. 数据包捕获:WipCap通过WinPcap库调用设备驱动,直接从网络适配器接收原始数据包。 4. 数据解析...

    NDIS-filter.rar_NDIS Filter_Windows NDIS Filter_filter_ndis_ndis

    这样设计使得NDIS Filter驱动能观察到所有进出的数据包,并根据需要进行处理,例如记录、修改或阻止数据包。这个特性在网络安全、性能监测和网络管理应用中非常有用。 "NDIS-filter.rar_NDIS Filter_Windows NDIS ...

    java源码:网络数据包捕获函数库 jNetPcap.zip

    - **事件驱动编程**:利用回调函数,可以在数据包到达时立即触发处理,避免了轮询检查的开销。 - **统计与调试**:提供丰富的统计信息和调试工具,如统计捕获到的包数量、错误信息等。 4. **应用场景** - **...

    数据包捕获源代码(抓包程序)

    压缩包中的"filter"文件可能是用于定义或示例数据包过滤规则的代码或文档,可以结合程序源码一起研究,以便理解和定制你的抓包需求。 总的来说,这个项目为学习网络数据包捕获提供了一个实践平台,通过它你可以深入...

    NDIS Filter Drivers指南

    根据不同的状态,Filter Module 可以执行不同的操作,如过滤数据包或传递数据包给下一个驱动程序。 4. **附加和分离 Filter Module**:可以动态地将 Filter Module 添加到适配器栈中或从中移除。这种灵活性允许在...

    网络数据包捕获函数库 jNetPcap

    2. **数据包过滤**:利用BPF(Berkeley Packet Filter)语法,jNetPcap允许开发者定义过滤条件,只捕获满足特定条件的数据包,提高处理效率。 3. **数据包解析**:jNetPcap支持多种网络协议的解析,如TCP、UDP、IP...

    ip包过滤收集.pdf

    - NPF (Netgroup Packet Filter):这是一个内核级的虚拟设备驱动程序,负责过滤数据包并将其传递给用户空间。它处理操作系统特定的部分。 - packet.dll:这是一个与操作系统无关的API接口,允许在不同版本的...

    IP过滤的源码

    IP过滤是网络安全中的关键组成部分,它允许系统根据预定义的规则来接受、拒绝或修改进出网络的IP数据包。通过在NDIS级别实现,这种过滤能够更早地干预数据包流程,提供了更高的性能和控制。 标签 "ndis" 和 "IP过滤...

    winpcap编程指南

    3. **数据包过滤**:如果需要过滤数据包,可以使用`pcap_compile()`和`pcap_setfilter()`函数创建并应用过滤规则。 4. **数据包捕获**:核心的捕获循环通常由`pcap_loop()`或`pcap_next()`函数实现。`pcap_loop()`...

Global site tag (gtag.js) - Google Analytics