精华内容
下载资源
问答
  • Windows8核心态网络过滤研究

    千次阅读 2012-06-08 17:05:57
    Windows 8是微软公司推出的最新的客户端操作系统,...在Windows8系统中,微软引入了两种新的网络过滤系统,WFP和NDISfilter。 WFP (Windows Filtering Platform) 其包含从用户态到核心态的一系列应用层,根据需要可

    Windows 8是微软公司推出的最新的客户端操作系统,内部名称Windows NT 80。相对于Windows NT 5.x,其网络结构变化非常大,原有的TDINDIS系统挂接方法不再适用。在Windows8系统中,微软引入了两种新的网络过滤系统,WFPNDISfilter

     WFP (Windows Filtering Platform)

     

     

    其包含从用户态到核心态的一系列应用层,根据需要可以在某一层设置回调函数拦截数据。

    1、  callout

    calloutWFP系统提供的扩展其功能的一种机制,callout由一组callout函数组成,每组有三种函数,

    ClassifyFunction,处理收到的网络数据,例如端口号IP地址等。NotifyFunction,处理加载、删除callout事件。

    FlowDeleteFunction,删除层与层之间关联的上下文。

    callout由callout驱动具体实现,每个驱动可以注册多个callout。

    2、WFP的层和层数据

    WFP有很多层,每一层分成若干子层,具体有哪些请参阅微软文档,我以FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4层为例进行讲解。这层位于ALE层,是其子层之一。面向连接的应用程序准备连接,面向无连接的程序准备通信,都发生在这一层。如果在这里拒绝了上述操作,应用程序就不能访问网络,这类似以前的TDI程序的Create事件,就是应用程序访问网络的请求刚到协议栈还没有处理。WFP每一层都有其特定的数据,根据这些数据又有特定的过滤条件,例如这层包括FWPS_METADATA_FIELD_PROCESS_ID类型数据,这个类型由UINT64类型数据定义,表示和本次网络访问请求相关的进程ID,可是FWPS_LAYER_INBOUND_IPPACKET_V4层就不包括这一类型的数据,其实FWPS_LAYER_INBOUND_IPPACKET_V4已经到了IP层,这里进程ID已经没用了。因此在FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4蹭可以以进程ID作为过滤条件,而到了FWPS_LAYER_INBOUND_IPPACKET_V4层就不能用进程ID作为过滤条件了。每一层都有哪些数据类型,根据这些数据有哪些过滤条件可用,请参阅微软的WFP文档层标识符等章节。

    综上,WFP系统很像一个已经有了数据过滤引擎的防火墙,但是没有规则。我们编写用户层的程序给WFP引擎设置规则,编写核心态的callout驱动处理WFP抓到的网络数据包。根据微软的文档所示,WFP能够到达IP层,如果我们想进行MAC层的处理,就必须利用NDISfilter驱动。

    3、应用WFP实现应用程序访问网络时提示

    这是个人防火墙的基本功能之一,当有应用程序访问网络时询问用户是否允许。首先我们编写一个callout驱动,用来处理WFP抓到的网络数据。由于WFP抓到的数据只送到callout驱动不会送到用户层程序,所以这里必须用驱动根据数据判定放行还是阻止。Callout驱动向系统注册callout函数,

        FWPS_CALLOUT0 sCallout;

        sCallout.calloutKey = *calloutKey;

        sCallout.flags = flags;

        sCallout.classifyFn = ClassifyFunction; //在实例代码中是MonitorCoFlowEstablishedCalloutV4

        sCallout.notifyFn = NotifyFunction;

        sCallout.flowDeleteFn = FlowDeleteFunction;

    status = FwpsCalloutRegister0(deviceObject, &sCallout, calloutId);

    FWPS_CALLOUT0结构用来组织一组callout函数,之后用FwpsCalloutRegister0函数注册。这里详细介绍下ClassifyFunction函数,这个函数主要处理网络数据包,

     

    NTSTATUS MonitorCoFlowEstablishedCalloutV4(

       IN const FWPS_INCOMING_VALUES0* inFixedValues,//WFP传进来的本层特有的数据

       IN const FWPS_INCOMING_METADATA_VALUES0* inMetaValues,//本层相关的扩展数据

       IN VOID* packet,

       IN const FWPS_FILTER0* filter,

       IN UINT64 flowContext,

       OUT FWPS_CLASSIFY_OUT0* classifyOut//用这个结构里的字段告知WFP对数据包做出处理

    )

    {

       NTSTATUS status = STATUS_SUCCESS;

       UINT64   flowHandle;

       UINT64   flowContextLocal;

       UINT32   index;

       UINT32   LocalIPADDRv4,remoteIPADDRv4;

       USHORT   LocalPort,remotePort;

     

       UNREFERENCED_PARAMETER(packet);

       UNREFERENCED_PARAMETER(filter);

       UNREFERENCED_PARAMETER(flowContext);

     

       index = FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_ADDRESS;

       LocalIPADDRv4 = inFixedValues->incomingValue[index].value.uint32;

     

       index = FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_LOCAL_PORT;

       LocalPort = inFixedValues->incomingValue[index].value.uint16;

     

       index = FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_REMOTE_ADDRESS;

       remoteIPADDRv4 = inFixedValues->incomingValue[index].value.uint32;

     

       index = FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_REMOTE_PORT;

       remotePort = inFixedValues->incomingValue[index].value.uint16;

     

       DbgPrint("BaseTDI: LocalIP %lx LocalPort %d \n remoteIP %lx remotePort %d",LocalIPADDRv4,LocalPort,

           remoteIPADDRv4,remotePort);

       DbgPrint("BaseTDI: PID %d ,PID's PATH %s",inMetaValues->processId,inMetaValues->processPath->data);

       DbgPrint("\n");

     

       if (monitoringEnabled)

       {

            //访问规则代码,在这里通知用户态程序

            AskUser(LocalIP, LocalPort, remoteIP, remotePort,PID);

            If 允许

              classifyOut->actionType = FWP_ACTION_PERMIT; //允许发送或接收

            else

              classifyOut->actionType = FWP_ACTION_BLOCK; //不允许发送或接收

       }

      return status;

    }

    在完成callout驱动后,下面介绍用户态程序如何设置WFP系统。

    设置的大体流程如下,

     

    主要代码讲解,

    //WFP系统添加callout

    DWORD WFPAppAddCallouts()

    {

        FWPM_CALLOUT0 callout;

        DWORD result;

        FWPM_DISPLAY_DATA0 displayData;

        HANDLE engineHandle = NULL;

        FWPM_SESSION0 session;

        //初始化一次会话

        RtlZeroMemory(&session, sizeof(FWPM_SESSION0));

        session.displayData.name = L"TEMP WFP Session";

        session.displayData.description = L"For Adding callouts";

       

        //创建WFP引擎句柄

        resultFwpmEngineOpen0(

            NULL,

            RPC_C_AUTHN_WINNT,

            NULL,

            &session,

            &engineHandle

            );

        if (NO_ERROR != result)

        {goto cleanup;}

        //开始与引擎交互

        result = FwpmTransactionBegin0(engineHandle, 0);

        if (NO_ERROR != result)

        {goto abort;    }

    ADD CALLOUT

        RtlZeroMemory(&callout, sizeof(FWPM_CALLOUT0));

        displayData.description = MONITOR_FLOW_ESTABLISHED_CALLOUT_DESCRIPTION;

        displayData.name = MONITOR_FLOW_ESTABLISHED_CALLOUT_NAME;

     

        callout.calloutKey = TEMP_MONITOR_FLOW_ESTABLISHED_CALLOUT_V4;

        callout.displayData = displayData;

        callout.applicableLayer = FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4;

        callout.flags = FWPM_CALLOUT_FLAG_PERSISTENT; //flags置这个标志表示callout始终被WFP加载

     

        result = FwpmCalloutAdd0(engineHandle, &callout, NULL, NULL);

        if (NO_ERROR != result)

        {goto abort;    }

    //结束本次会话

        result = FwpmTransactionCommit0(engineHandle);

        if (NO_ERROR == result)

        {;}

        goto cleanup;

    abort:

       

        //说明本次会话失败

        result = FwpmTransactionAbort0(engineHandle);

        if (NO_ERROR == result)

        {;}

    cleanup:

        //关闭引擎

        if (engineHandle)

        {

            FwpmEngineClose0(engineHandle);

        }

        return result;

    }

    //WFP系统添加filter

    DWORD

    WFPAppAddFilters(IN  HANDLE engineHandle/*,IN FWP_BYTE_BLOB* applicationPath*/)                

    {

        DWORD result = NO_ERROR;

        FWPM_SUBLAYER0 monitorSubLayer;

        FWPM_FILTER0 filter;

        FWPM_FILTER_CONDITION0 filterConditions[1]; //需要几条规则就定义几条

     

        //初始化过滤条件

        RtlZeroMemory(filterConditions, sizeof(filterConditions));

        filterConditions[0].fieldKey = FWPM_CONDITION_IP_PROTOCOL;//所有IP协议数据

        filterConditions[0].matchType = FWP_MATCH_GREATER_OR_EQUAL;//匹配度,大于,小于,大于等于

        filterConditions[0].conditionValue.type = FWP_UINT8;

        filterConditions[0].conditionValue.uint8 = IPPROTO_IP;

     

        //初始化子层

        RtlZeroMemory(&monitorSubLayer, sizeof(FWPM_SUBLAYER0));

        monitorSubLayer.subLayerKey = TEMP_MONITOR_SUBLAYER;

        monitorSubLayer.displayData.name = L"TEMP Monitor Sub layer";

        monitorSubLayer.displayData.description = L"TEMP Monitor Sub layer";

        monitorSubLayer.flags = 0;//FWMP_SUBLAYER_FLAG_PERSISTENT;

        // We don't really mind what the order of invocation is.

        monitorSubLayer.weight = 0;

     

        //与WFP引擎开始一次会话

        result = FwpmTransactionBegin0(engineHandle, 0);

        if (NO_ERROR != result)

        {goto abort;}

        //增加一个子层

        result = FwpmSubLayerAdd0(engineHandle, &monitorSubLayer, NULL);

        if (NO_ERROR != result)

        {goto abort;}

     

    FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4

        RtlZeroMemory(&filter, sizeof(FWPM_FILTER0));

     

        filter.layerKey = FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4;

        filter.displayData.name = L"Flow established filter.";

        filter.displayData.description = L"Sets up flow for traffic that we are interested in.";

        filter.action.type = FWP_ACTION_CALLOUT_INSPECTION; //表示把符合条件数据包交给callout处理

        filter.action.calloutKey = TEMP_MONITOR_FLOW_ESTABLISHED_CALLOUT_V4;

        filter.filterCondition = filterConditions;

        filter.subLayerKey = monitorSubLayer.subLayerKey;

        filter.weight.type = FWP_EMPTY; //系统自动设置weight。weight值越大加载越靠前

     

        filter.numFilterConditions = 1;//过滤条件数

     

        result = FwpmFilterAdd0(engineHandle,

            &filter,

            NULL,

            &(filterID[0]));

     

        if (NO_ERROR != result)

        {goto abort;}

     

    //结束本次会话

        result = FwpmTransactionCommit0(engineHandle);

        if (NO_ERROR == result)

        {;}

        goto cleanup;

    abort:

    //说明本次会话失败

        result = FwpmTransactionAbort0(engineHandle);

        if (NO_ERROR == result)

        {;}

    cleanup:

        return result;

    }

    二、NDISfilter

    NDISfilter是利用系统提供的NDIS过滤引擎,获得MAC级别的网络数据包(这里可以看出WFP,NDISfilter,还有本文未提到的FileSystemMiniFilter,他们都是利用了微软提供的过滤引擎,向其注册回调函数,得到数据后处理)。关键代码说明,其中的详细数据结构请参阅微软文档NDISfilter一节,

     

    NDIS_FILTER_DRIVER_CHARACTERISTICS      FChars;

     

     NdisZeroMemory(&FChars, sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS));

            FChars.Header.Type = NDIS_OBJECT_TYPE_FILTER_DRIVER_CHARACTERISTICS;

            FChars.Header.Size = sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS);

            FChars.Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_1;

            FChars.MajorNdisVersion = FILTER_MAJOR_NDIS_VERSION;

            FChars.MinorNdisVersion = FILTER_MINOR_NDIS_VERSION;

            FChars.MajorDriverVersion = 1;

            FChars.MinorDriverVersion = 0;

            FChars.Flags = 0;

     

            FChars.FriendlyName = FriendlyName;

            FChars.UniqueName = UniqueName;

            FChars.ServiceName = ServiceName;

     

            FChars.SetOptionsHandler = FilterRegisterOptions;       

            FChars.AttachHandler = FilterAttach;//如果是我们想挂接的网络介质,就在这里通知系统挂接

            FChars.DetachHandler = FilterDetach;

            FChars.RestartHandler = FilterRestart;

            FChars.PauseHandler = FilterPause;

            FChars.SetFilterModuleOptionsHandler = FilterSetModuleOptions;          

            FChars.OidRequestHandler = FilterOidRequest;

            FChars.OidRequestCompleteHandler = FilterOidRequestComplete;

            FChars.CancelOidRequestHandler = FilterCancelOidRequest;

           

            FChars.SendNetBufferListsHandler = FilterSendNetBufferLists;//发送回调函数    

            FChars.ReturnNetBufferListsHandler = FilterReturnNetBufferLists;

            FChars.SendNetBufferListsCompleteHandler = FilterSendNetBufferListsComplete;

            FChars.ReceiveNetBufferListsHandler = FilterReceiveNetBufferLists;//接收回调函数

            FChars.DevicePnPEventNotifyHandler = FilterDevicePnPEventNotify;

            FChars.NetPnPEventHandler = FilterNetPnPEvent;

            FChars.StatusHandler = FilterStatus;

            FChars.CancelSendNetBufferListsHandler = FilterCancelSendNetBufferLists;

     

    NDIS_FILTER_DRIVER_CHARACTERISTICS这个结构用来组织NDISfilter功能函数供NDIS系统回调,例如FilterSendNetBufferLists,发送数据回调函数,NDIS发送MAC帧时回调这个函数,相应数据可以在这个函数里得到处理,之后还给NDIS系统继续处理。

    VOID

    FilterSendNetBufferLists(

            IN  NDIS_HANDLE         FilterModuleContext,

            IN  PNET_BUFFER_LIST    NetBufferLists,

            IN  NDIS_PORT_NUMBER    PortNumber,

            IN  ULONG               SendFlags

            )

    {

        PMS_FILTER          pFilter = (PMS_FILTER)FilterModuleContext;

        NDIS_STATUS         Status = NDIS_STATUS_SUCCESS;

        PNET_BUFFER_LIST    CurrNbl;

    BOOLEAN             DispatchLevel;

     

    //这里开始分析PNET_BUFFER_LIST指向的网络数据,并显示如何获得MAC地址

        PNET_BUFFER_LIST      pNetBufList,pNextNetBufList;

        PMDL                  pMdl;

        PNDISPROT_ETH_HEADER  pEthHeader = NULL;

        ULONG                 TotalLength,Offset,BufferLength;

     

        pNetBufList = NetBufferLists;

     

        while (pNetBufList != NULL)

        {

            pNextNetBufList = NET_BUFFER_LIST_NEXT_NBL (pNetBufList);

            //得到当前和包相关的MDL,MDL里即MAC帧,详细的NET_BUFFER_LIST结构请参阅微软相关文档

            pMdl = NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(pNetBufList));  

            TotalLength = NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(pNetBufList));

            Offset = NET_BUFFER_CURRENT_MDL_OFFSET(NET_BUFFER_LIST_FIRST_NB(pNetBufList));

            BufferLength = 0;

            do

            {

                ASSERT(pMdl != NULL);

                if (pMdl)

                {

                    NdisQueryMdl(

                        pMdl,

                        &pEthHeader,

                        &BufferLength,

                        NormalPagePriority);

                }

     

                if (pEthHeader == NULL)

                {

                    BufferLength = 0;

                    break;

                }

     

                if (BufferLength == 0)

                {

                    break;

                }

                ASSERT(BufferLength > Offset);

     

                BufferLength -= Offset;

                pEthHeader = (PNDISPROT_ETH_HEADER)((PUCHAR)pEthHeader + Offset);

     

                DbgPrint("DstMAC %x-%x-%x-%x-%x-%x",pEthHeader->DstAddr[0],

                    pEthHeader->DstAddr[1],pEthHeader->DstAddr[2],

                    pEthHeader->DstAddr[3],pEthHeader->DstAddr[4],

                    pEthHeader->DstAddr[5]);

     

                DbgPrint("srcMAC %x-%x-%x-%x-%x-%x",pEthHeader->SrcAddr[0],

                    pEthHeader->SrcAddr[1],pEthHeader->SrcAddr[2],

                    pEthHeader->SrcAddr[3],pEthHeader->SrcAddr[4],

                    pEthHeader->SrcAddr[5]);

                DbgPrint("\n");

     

                if (BufferLength < sizeof(NDISPROT_ETH_HEADER))

                {

                    break;

                }

            }while (FALSE);

            pNetBufList = pNextNetBufList;

        }

    }

     

    展开全文
  • 现在基于域名和IP地址的网络过滤封锁为什么不那么容易破解的原因是, DNS系统是一个非常落后的架构 比如说它的恶心的区域传送机制,可能2个DNS服务器之间的数据同步需要花几小时 实际上,这个过程应该可以更快...

    现在基于域名和IP地址的网络过滤封锁为什么不那么容易破解的原因是,

    DNS系统是一个非常落后的架构

    比如说它的恶心的区域传送机制,可能2个DNS服务器之间的数据同步需要花几小时

    实际上,这个过程应该可以更快一点

    下面讲述如何用常规手段破解基于域名和IP地址的网络过滤封锁?

    1、基于语义搜索和人机交互参与的公开入口检索(也就是说,从应用层发起一个端点查询请求,而非从低级TCPIP网络层)

    2、基于人机交互参与的客户端认证(也就是说,必须证明是一个真实的人发起的请求,而非机器自动的)发送一个新的跳转地址,最好能够做到端到端加密和独一无二

    3、快速失效机制

       如果检测到目标端已经被封锁(基于IP地址的),则能够让它快速失效,这就要求网站的前端服务器必须能够快速切换

    邪恶的gfw使用有效IP地址来使得目标DNS服务器“中毒”,这种行为简直太无耻鸟。

    展开全文
  • 写在之前:换工作了,做Win驱动开发,还是网络过滤驱动。之前从未接触过这些,只是做着单机的桌面应用程序,所以一切是从头开始。从驱动到网络,很多的不懂,一步步走来,现在多少有些进展了,现在就总结下这段过程....

    写在之前:换工作了,做Win驱动开发,还是网络过滤驱动。之前从未接触过这些,只是做着单机的桌面应用程序,所以一切是从头开始。从驱动到网络,很多的不懂,一步步走来,现在多少有些进展了,现在就总结下这段过程.(驱动开发确实麻烦,现在看见蓝屏依然会心惊肉跳)

    一.什么是ndis lwf驱动:

    NDIS: Network Driver Interface Specification.就是微软的一套网络驱动接口规范,包含好几个部分。LWF只是其中的一小部分,属于过滤型驱动。虽然说它是驱动,其实在安装的时候还是以服务的形式加载。其实网络过滤型驱动有还有其他的方式,如IM中间层驱动,不过因为种种原因,可能是效率方面的考虑吧,微软已不再推荐使用IM驱动,WIN10上IM驱动是无法使用的,所以为了将来考虑,网络过滤型驱动还是选择LWF较好。不过LWF是无法在XP及以下的系统中使用的。

    二.:LWF驱动能做什么:

    简单说LWF驱动就是过滤网卡上网络数据流,由于是绑定在网卡上,所以得到的数据其实都是以太网的帧。所以得到这些数据后你就可以修改它们再进行传输,或者什么都不干。

    LWF驱动在系统中的位置关系如下:

    可以看到,lwf是在协议层和网卡驱动之间的驱动。所以在数据传输出去和传输给应用之前它可以随意修改数据。需要说明一下的是,为了统一概念,数据向上传输,指的是数据由物理网卡传输至协议层,数据向下传输,指的是数据由协议层传输至物理网卡。

    三.LWF中的数据结构

    LWF中用它自己的方式存储以太网中的数据帧,这就是NBL(NET_BUFFER_LIST),也就是在代码中,通过你注册的回调函数的参数系统将数据以PNET_BUFFER_LIST形式会传递给你,这时候你就能做数据过滤的操作了。这是个LIST,其中每个NBL又包含若干个NB(NET_BUFFER),每个NB有包含若干个MDL。真正的数据在这MDL中。其实他们的数据结构都挺复杂的,我没仔细研究过,网上有得到MDL数据的方法,拿来用之。如果想完全弄明白他们中各个成员变量的意义,可以参考http://codemachine.com/article_ndis6nbls.html,写的很详细。我这里大概说下,其实来来回回用的属性也就那些了。


    可以看到,系统会传递给你一个NBL,这个LIST可能包含多个NBL。每个NBL中的数据是独立的。所以只需要遍历NBL LIST就行了。

    其中,NBL又是有一个或多个NB,以太网的数据帧是以NB为单位存储的。也就是说如果一个TCP包(包含MAC头和IP头)大小为3000Bytes。有可能这一个TCP包放在一个NB中,也有可能会按照你网卡MTU的大小分为若干个包含相同目的地址的TCP包放在一个NBL的不同NB中,每个NB是一个数据帧。分不分包取决于LWF的设置,分包过程是由系统完成的,你收到的NBL是一个正常的数据帧,理论上是不需要你在做任何分包操作的。理解了这些之后就看MDL,其实真正的数据是放在MDL中的,但是这个MDL也是个LIST并且包含有效数据区和无效数据区,要找到有效数据区的起始地址和长度就能得到真正的数据了。可以看到图中的NB.DataOffset就是NB中MDL的有效数据区的起始地址,NB.DadaLength就是有效数据区的长度。

    NBL,NB,MDL都是List,得到第一个的地址后通过->Next就可以遍历所有对象了。大致代码如下:

    得到一个NB中所有MDL有效数据如下,(次代码是网上拷贝而来)

    /*******************************************************************
    * GetNetBufferData函数的功能:
    * 从1个NET_BUFFER里面获取数据。1个NET_BUFFER里面含有1个或者多个的MDL
    *******************************************************************/
    VOID GetNetBufferData(PNET_BUFFER NetBuffer, PUCHAR OutputBuffer, ULONG OutputBufferSize, PULONG OutputBytesCopied)
    {
    
    	PMDL  Mdl = NetBuffer->CurrentMdl;
    	*OutputBytesCopied = 0;
    
    	if (NetBuffer->DataLength > OutputBufferSize)
    	{
    		return;
    	}
    
    	NdisMoveMemory(OutputBuffer, (PUCHAR)MmGetSystemAddressForMdlSafe(Mdl, LowPagePriority) + NetBuffer->CurrentMdlOffset, Mdl->ByteCount - NetBuffer->CurrentMdlOffset);
    
    	OutputBuffer += Mdl->ByteCount - NetBuffer->CurrentMdlOffset;
    	*OutputBytesCopied += Mdl->ByteCount - NetBuffer->CurrentMdlOffset;
    
    	/*
    	* 循环 MDL链表,获取每一个结点的数据,数据被保存到 OutputBuffer里面OutputBuffer的空间不断地扩大。
    	* 当链表不为空, 并且 OutputBuffer的长度 < 1个NET_BUFFER的总长度。
    	*/
    	while (((Mdl = Mdl->Next) != NULL) && (*OutputBytesCopied < NetBuffer->DataLength))
    	{
    		NdisMoveMemory(OutputBuffer, MmGetSystemAddressForMdlSafe(Mdl, LowPagePriority), Mdl->ByteCount);
    		OutputBuffer += Mdl->ByteCount; /* 数据被保存到 OutputBuffer里面 */
    		*OutputBytesCopied += Mdl->ByteCount;   /* OutputBuffer的空间不断地扩大 */
    	}
    
    	if (Mdl != NULL)
    	{
    		NdisMoveMemory(OutputBuffer, MmGetSystemAddressForMdlSafe(Mdl, LowPagePriority), NetBuffer->DataLength);
    		OutputBuffer += Mdl->ByteCount;
    		*OutputBytesCopied += Mdl->ByteCount;
    	}
    }
    遍历NBL及NB

    	/* Get data from NBL. */
    	for (PNET_BUFFER_LIST pList = pSrcNetBufferLists; pList; pList = NET_BUFFER_LIST_NEXT_NBL(pList))
    	{
    		for (PNET_BUFFER pBuf = NET_BUFFER_LIST_FIRST_NB(pList); pBuf; pBuf = NET_BUFFER_NEXT_NB(pBuf))
    		{
    			ULONG bytesCopied = 0;
    			PUCHAR pOriMDLData = (PUCHAR)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle, MAX_BUFFER_SIZE, FILTER_ALLOC_TAG, LowPoolPriority);
    			GetNetBufferData(pBuf, pOriMDLData, MAX_BUFFER_SIZE, &bytesCopied);
    		}
    	}
    这样在你注册的回调函数中就就能解析系统传进来的NBL了。











    展开全文
  • Charles使用二:设置网络过滤

    千次阅读 2018-08-13 01:08:00
    进行网络抓包时,主要是是针对特定的请求进行抓包,这就需要将不需要显示的网络请求剔除掉(不显示),将需要的网络请求显示界面上; 设置方法:在Charles菜单栏上选择“Proxy”->”Recording Settings”,...

    进行网络抓包时,主要是是针对特定的请求进行抓包,这就需要将不需要显示的网络请求剔除掉(不显示),将需要的网络请求显示界面上;

     

    设置方法:在Charles菜单栏上选择 “Proxy”->”Recording Settings”,然后在“Recording Settings”弹窗中选择“Include”,点击“add”添加一条过滤规则;

    填写内容:协议(可选)、host(必填项,IP或者域名)、port(选填,端口)、path(选填、路径)、Query(选填,查询)

    备注:提示语——Eapty字段匹配所有valuss。通配符*和?可以使用。(参数可以使用*或者?代替)

     

     

    另一种方法:可以设置零时性过滤,来查看相应的数据

    转载于:https://www.cnblogs.com/xiashang/p/9465730.html

    展开全文
  • Windows 8是微软公司推出的最新的客户端OS,内部名称Windows ...在Windows8系统中,微软引入了两种新的网络过滤系统,WFP和NDISfilter。 WFP (Windows Filtering Platform) 其包含从用户态到核心态的一系列应用
  • wfp网络过滤框架总结(一)

    千次阅读 2016-01-15 22:40:49
    filter 为TCP/IP网络数据定义了一些过滤条件,以及当所有的条件都成立时采取的放行还是拒绝的决策行为。如果一个filter要求对网络数据包做另外的处理时,它可以 指定一个callout完成操作。如果这个filter的所有...
  • TDI FILTER 网络过滤驱动完全解析

    万次阅读 2010-10-06 22:57:00
     TDI FILTER 过滤驱动的功能一般用来进行整个系统中的所有网络流量的分析,记录和管理,可以实现非常强大的管理功能,这里就将讨论它的设计架构,和具体实现的方法。    进行系统级网络数据包的过滤,很明显,第...
  • 首先是libvirt定义网络过滤规则的相关命令: virsh nwfilter-define  后面加上一个xml文件,从一个XML文件中定义或者更新一个网络过滤规则。 virsh nwfilter-dumpxml  后面加上某个网络过滤规则的...
  • 万象网络管理网络管理过滤插件网络管理过滤插件网络管理过滤插件网络管理过滤插件网络管理过滤插件网络管理过滤插件
  • 网络信息过滤

    2016-11-09 07:03:58
    用DELPHI实现网络信息过滤(附文档,程序可能有bug)
  • 网络内容过滤 网络内容过滤技术 - 过滤3步 网络内容过滤技术 - 过滤3步 网络内容过滤技术 - 过滤3步 论文
  • Java实现一个可过滤垃圾信息的网络消息过滤器雏形源码,通过这个原型程序,或许可以得到更多类似于网络过滤方面的技巧。
  • 基于URL过滤与内容过滤网络净化模型基于URL过滤与内容过滤网络净化模型基于URL过滤与内容过滤网络净化模型
  •  设计的方法是基于网络层的网页过滤方法,在网络设备上实现对网页的过滤。采用URL 过滤与内容过滤相结合的方式,取安全与性能的折中。  1 网页过滤总体框架  一台主机要访问Web 服务器,首先与Web 服务器进行三...
  • 功能简介> Network filtering XML为虚拟化系统管理员提供对了一种网络流量的过滤规则,... Network filtering子系统允许每一个虚拟机的网络过滤表可以被单独配置。我们可以在启动时配置虚拟机的访问控制过滤表,也可
  • 天融信网络卫士过滤网关系统防病毒网关采取了一个与单机防护不同的基于网络的病毒防护方案。它被设计成安装在网络边缘,在病毒侵入网络之前实时的阻止它们,并且没有传统解决方案通常都有的延时。网络卫士防病毒网关...
  • 天融信网络卫士过滤网关技术白皮书.pdf
  • 网络过滤的含义

    千次阅读 2015-01-16 21:31:48
    网络设备检查收到网络帧的目的地址,当发现它们目的地址与自己的地址不一致,就丢弃这个数据包,这个行为叫过滤
  • 网络可视化——流量过滤

    千次阅读 2020-02-11 17:22:12
    监控和保护现代网络需要在不破坏网络,甚至不破坏网络流量的情况下找到“针”。非常先进和自动化的分析工具使这成为可能。 专用工具,例如: •网络性能监视和诊断(NPMD) •应用程序性能监视(APM) •下一代...
  • 过滤网络爬虫的研究与设计.pdf过滤网络爬虫的研究与设计.pdf过滤网络爬虫的研究与设计.pdf过滤网络爬虫的研究与设计.pdf
  • 测试笔记5——Charles过滤网络请求

    千次阅读 2019-05-03 01:51:02
    Charles过滤网络请求 Charles过滤网络请求的三种方式: 在主界面的Filter栏输入需要过滤出来的关键字; 在菜单选择“Proxy”->“Recording Settings”,在弹出的窗口中选择Include栏,再点击"Add",在弹出窗口.....
  • 用户态防火墙的框架,来自Windows防火墙与网络封包截获技术中的PacketCapture例子
  • 来源于网络,增加了端口过滤功能。当端口为0是不进行过滤
  • Netfilter与FreeBSD的网络过滤

    千次阅读 2012-04-07 11:29:28
    在Linux中,使用Netflter来进行包过滤,所有的逻辑都要挂接在Netfilter的某个或者某些HOOK点上,并且实现成该HOOK点上的一个或者多个hook函数,这在Netfilter框架中是用nf_hook_ops结构体来表示的,整个Netfilter的...
  • Linux下网络数据包抓取源码分析和包过滤,请大家下载学习,用C开发的
  • WINDOWS网络过滤技术

    千次阅读 2005-01-28 08:41:00
    WINDOWS网络过滤技术   (原文:http://www.ndis.com/papers/winpktfilter.htm) //似乎是翻译的#转者注:) //作 者: sevencat (七猫) //原文作者不详#转者注 一、user-mode网络过滤 1、winsock...
  • Linux kernel过滤网络数据包

    千次阅读 2015-09-16 22:36:28
    原理剖析内核过滤数据包,第一个想到的是iptables,这个东西是用户层的, 深入点就是netfilter了。 netfilter的5个钩子点可以实现这个。 对内核熟悉点的人会知道layer7, 有的使用框架snort,layer7已经不更新,继承...
  • 为提高个性化推荐系统的推荐效率和准确性, 提出了个性化推荐系统的二分网络协同过滤算法。协同过滤算法引入二分网络描述个性化推荐系统, 使用灰色关联度来度量用户相似性和项目相似性, 对灰色关联相似度加权求和预测...
  • 在对Windows 2000/XP操作系统下网络过滤器钩子驱动分析基础上,提出了一种在 Windows 2000/XP操作系统下网络数据包拦截技术.该技术巧妙地将过滤器钩子挂接到系统默认的IP过滤器驱动上,实现数据包过滤,其主要依据是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 386,875
精华内容 154,750
关键字:

网络过滤