HarryPotter
驱动牛犊
驱动牛犊
  • 注册日期2003-07-28
  • 最后登录2004-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1816回复:7

哪有IP数据包过滤程序的示例代码

楼主#
更多 发布于:2003-07-28 11:27
我需要IP包过滤程序的源代码,越简单的越好,最好是一个C文件的,不需要GUI,只要能过滤IP包就行了

最新喜欢:

happybdhappyb...
xi903
驱动牛犊
驱动牛犊
  • 注册日期2002-06-19
  • 最后登录2009-07-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-28 12:23
please refer DDK: PacketFilterExtensionPtr
HarryPotter
驱动牛犊
驱动牛犊
  • 注册日期2003-07-28
  • 最后登录2004-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-29 17:23
我不太懂驱动程序开发,想要一个简单包过滤程序的完整的C文件代码,这样我就只要修改包过滤规则那部分了
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-30 23:02
世界上那有这么好的事,完整源代码很费心血的,你说要就要了,
实在想要的话。。。。。。。。。
去翻gjpland和fracker的旧帖子吧
鬼啊~~~~~~~~
HarryPotter
驱动牛犊
驱动牛犊
  • 注册日期2003-07-28
  • 最后登录2004-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-31 01:26
谢谢啊!那我去找找看

我觉得这种程序是有通用性的,因为我并不关心驱动程序的问题,只是关心IP包过滤部分的代码。如果没有范例代码的话,实际上也是开发者的重复劳动了
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-01 08:11
部分代码:

    
        //---------------------------------------------------------
        int        PacketSize;
    PUCHAR        pPacketContent;
    PUCHAR        pBuf;
    UINT         BufLength;
    MDL    *     pNext;
    UINT         i;
    
    //把数据包内容从Packet拷贝到pPacketContent

    NdisQueryPacket( Packet,NULL,NULL,NULL,&PacketSize);
    
    Status= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableMax);
    if (Status!=NDIS_STATUS_SUCCESS ) return Status;
    NdisZeroMemory (pPacketContent, 2000);
    
    NdisQueryBufferSafe(Packet->Private.Head, &pBuf, &BufLength, 32 );
    NdisMoveMemory(pPacketContent, pBuf, BufLength);

    i = BufLength;
    pNext = Packet->Private.Head;
    
    for(;;)
    {
        if(pNext == Packet->Private.Tail)
            break;
            pNext = pNext->Next;   //指针后移
            if(pNext == NULL)
                break;

            NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
            NdisMoveMemory(pPacketContent+i,pBuf,BufLength);
            i+=BufLength;
    }
    
    //数据拷贝完毕
    //---------------------------------------------------------
    
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-01 08:12

    
        //---------------------------------------------------------
        //规则标志位(1表示过滤,0表示放行,你可以通过改这个数值来配置规则)
    UINT        ICMP = 1;     //ICMP数据报规则
    UINT        IGMP = 0;    //IGMP数据报规则
    UINT        TCP = 0;    //TCP数据报规则
    UINT        UDP = 0;    //UDP数据报规则
    
        //规则判断
    if (ICMP == 1)
    {
        if(((char *)pPacketContent)[12] == 8 &&
            ((char *)pPacketContent)[13] == 0 &&
                ((char *)pPacketContent)[23] == 1)
        {
            DbgPrint(\"ICMP被拦截!\\n\");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }
    
    if (IGMP == 1)
    {
        if(((char *)pPacketContent)[12] == 8 &&
            ((char *)pPacketContent)[13] == 0 &&
                ((char *)pPacketContent)[23] == 2)
        {
            DbgPrint(\"IGMP被拦截!\\n\");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }
    
    if (TCP == 1)
    {
        if(((char *)pPacketContent)[12] == 8 &&
            ((char *)pPacketContent)[13] == 0 &&
                ((char *)pPacketContent)[23] == 6)
        {
            DbgPrint(\"TCP被拦截!\\n\");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }
    
    if (UDP == 1)
    {
        if(((char *)pPacketContent)[12] == 8 &&
            ((char *)pPacketContent)[13] == 0 &&
                ((char *)pPacketContent)[23] == 17)
        {
            DbgPrint(\"UDP被拦截!\\n\");
            NdisFreeMemory(pPacketContent, 2000, 0);
            return NDIS_STATUS_NOT_ACCEPTED;
        }
    }

    //规则判断结束
    //---------------------------------------------------------        

    
    
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-01 08:18
上面的代码是当在ptreceive中NDISGETRECEIVEPACKET!=NULL
还有ptreceivepacket中的处理。
当ptreceive中NDISGETRECEIVEPACKET为NULL空时:又分两种情况
1。要transferdata,把剩余数据传上来在分析。
2。不要transferdata,

如果只要过滤特定协议的话,剩余的数据不传上来也可以。
只要把HEADERBUFFER和lookaheadbuffer中的内容组合起来就可以了

上面的代码是ZT,并且也有点垃圾。呵呵
放弃瘟草,现吃李草
游客

返回顶部