欢迎光临极品网,更多、更新的资源信息尽在Jpinw.Com!本站所有信息资源每日更新新的内容,请大家继续关注www.Jpinw.com!如果觉得本站还不错,对您有帮助,别忘了向您的朋友推荐本站!请记好本站网址:http://www.Jpinw.com,网站发展靠大家多多的支持!!!

极品网 极品课件 极品论文 极品文学 极品游戏 极品美容 极品手机资源 极品股票

#
免费资源: 免费域名 | 免费空间 | 免费推广 | 免费邮箱 | 免费硬盘 | 免费论坛 | 免费留言 | 免费统计 | 在线投稿 | 更多...
电脑学院: 操作系统 | 安全相关 | 网页设计 | 编程开发 | 建站经验 | 服务器类 | 黑客攻防 | 菜鸟入门 | 教你网赚 | 更多...
文章导航: 网赚学堂 | 网赚秘笈 | 网赚三维 | 网赚先锋 | 网赚资讯 | 感悟网赚 | 众生百态 | 经典美文 | 范文中心 | 更多...
图酷天下: 时事图酷 | 娱乐图酷 | 搞笑图酷 | 时尚图酷 | 体育图酷 | 另类经典 | 论文资源 | 课件下载 | 文学知识 | 更多...

您现在的位置: 极品网 >> 电脑学院 >> 黑客攻防 >> 黑客编程 >> 教程正文

基于IMD的包过滤防火墙原理与实现 下          【字体:
基于IMD的包过滤防火墙原理与实现 下
作者:佚名    教程来源:不详    点击数:    更新时间:2006-5-29    

 








四、部分演示代码

    我们的目的是在调用接受数据报函数的时候能执行我们的过滤代码,所以,我们要在函数代码中添加我们自己的代码,下面用过滤特定协议类型的数据报来做演示。
    
    首先修改PtReceive,看一下protocol.c文件中函数的代码,代码中用NdisGetReceivedPacket函数得到一个PNDIS_PACKET的结构Packet,数据报内容就存放在这个结构中的链表内。我们定义一个PUCHAR结构的pPacketContent,然后用下面的代码获得整个数据报的内容:
    
        //---------------------------------------------------------
        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;
    }
    
    //数据拷贝完毕
    //---------------------------------------------------------
    
    
    现在,我们已经在PtReceive函数中得到了数据报的内容,存放在pPacketContent中,数据报的格式你可以去查书。通常,在以太网中,得到的数据报大致是如下结构,以太帧头14个字节,放在pPacketContent[0]到pPacketContent[13]中,其中前六个字节是目的MAC地址,然后六个字节源MAC地址,然后两个字节是协议类型,通常的协议类型有0x08 0x00 ->IP,0x08 0x06 ->ARP,0x08 0x35 ->RARP,所以,可以通过pPacketContent[12]和pPacketContent[13]来判断协议类型。如果是IP包,然后pPacketContent中存放的是IP头,根据IP头的格式,可以得到第23个字节pPacketContent[23]表示传输层协议:1 ->ICMP,2 ->IGMP,6 ->TCP,17 ->UDP,剩下的就是数据报内容了。因为我们只是做演示,所以只要知道这几个标志性的就好了,其他的你可以根据你的需要扩展。我们通过pPacketContent中的内容可以做些规则,比如过滤ICMP包,我们只要比较pPacketContent[12]和pPacketContent[13]还有pPacketContent[23]这三个标志位就可以了,如果不是ICMP包,那么不做任何工作,如果匹配了,那就返回一个NDIS_STATUS_NOT_ACCEPTED,将包丢弃,释放pPacketContent,就可以过滤ICMP包了,下面就是过滤规则的代码。
    
        //---------------------------------------------------------
        //规则标志位(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;
        }
    }

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

    
    到这里,PtReceive函数已经修改完了,只要调用PtReceive函数接收数据报的时候,就可以执行我们的规则了,下面修改PtReceivePacket函数,其实上面的修改代码内容都是一样的,只不过PtReceivePacket函数跟PtReceive函数不太一样,PtReceivePacket直接在入口参数中就得到了PNDIS_PACKET的结构Packet,存放了数据报的所有内容,所以,直接将上面的代码粘到函数PtReceivePacket的代码中就可以了。到现在,无论是网卡调用哪一个接收函数,都可以执行我们需要的规则。
    
    其实,上面所定义的规则是很简单的,因为只作为演示用,而我的课题嘛,嘿嘿,就不是那么简单了。其实在pPacketContent已经得到了所有的数据报内容,我们可以随意扩展规则。比如,过滤指定IP、指定端口的数据报,至于具体应该设置哪个位置,你只要去找一本介绍数据报结构的书看一下就知道了,呵呵。
    
    
    
五、驱动编译与安装

    前面谈了那么多,其实都是在说IMD包过滤的实现和驱动代码,但是,我已经修改了代码,怎么编译和安装呢?
    
    这一部分就解决驱动编译和安装的问题。我们用passthru的代码,对接收数据报的部分做了修改。然后,我们用DDK自带的builder工具来编译。我一般是用开始菜单中DDK程序组中的Free Build Environment,到passthru目录下执行build -cz来编译passthru,得到passthru.sys文件,然后再到NTDDK\src\network\config\filter目录下,执行build -cz来得到sfilter.dll,然后再加上passthru目录下的netsf.inf和netsf_m.inf,一共四个文件。这样,驱动安装所需要的文件就全了。
    
    打开网络属性,添加服务,找到passthru目录下,安装,弹出没有数字签名的警告,不理,继续安装,最后,你会发现,网络属性中增加了一个名为Sample Filter的组件,同时,硬件管理器中的网卡下增加了一个Sample Filter Miniport的设备。如果你已经到了这里,并且系统没有出现蓝屏和死机,那么恭喜你,你已经成功地安装上了中间层驱动,并且已经发挥包过滤作用了。
    
    
    
六. 总结

    难得我写了那么多,现在做一个总结吧。上文中的代码,我只是用来做演示的,只用来说明基于IMD的包过滤防火墙原理与实现,其实需要做的工作还有很多,驱动上面碰到的问题会很多,并且常常伴随着的是蓝屏,死机,甚至要重装系统。
    
    你也许会问,那我每次改一下规则难道还要重新再安装一遍驱动么,况且,必须重启动一次,旧的驱动才彻底卸载掉,多麻烦啊。呵呵,其实是中间层驱动是可以跟应用层的程序结合的。首先你要在驱动中指定好规则,应用层的程序通过DeviceIoControl传递指令到驱动中,可以控制驱动的规则标志位。
    
    特别推荐驱动开发网(_blank>www.driverdevelop.com)论坛的ndis网络接口开发版,这里是国内水平最高的地方,所有的与驱动有关的问题你都可以在那里得到解决。
    
    最后,附带说一句,调试驱动的时候先做好处理系统后事的准备,对于出现的任何系统问题也好,硬盘问题也好,我不负任何责任,呵呵。

  

 

教程录入:dping    责任编辑:dping 
  • 上一篇教程:

  • 下一篇教程:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关教程
    各位大虾高手请进——关于IP
    phime2002async和phime2002a
    COCIManager.exe是什么进程啊
    csrss.exe这个病毒如何删除(
    谁近期用网络上提供的替代法
    各位高手,Ms RunTime 2.6是
    关于IEXPLORE.EXE病毒...
    电脑不断弹出提示 runtime e
    关于IEXPLORE.EXE进程的疑问
    关于IIS下的目录的列表访问?
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    极品网
    | 设为首页 | 加入收藏 | 友情链接 | 版权声明 |
    极品网

    Copyright 2006 Jpinw.com 极品网

    备案号:申请中

    极品网