您的位置:首页 >> 编程开发 >> Visual C++ >> 正文
Visual C++ RSS
 

基于IMD的包过滤防火墙原理与实现

http://www.rdxx.com 02年05月17日 11:36 互联网 我要投稿

关键词: 过滤防火墙
一、前言
二、IMD中间层技术介绍
三、passthru例程分析
四、部分演示代码
五、驱动编译与安装
六. 总结



一、前言

    前段时间,在安全焦点上看到了TOo2y朋友写的《基于SPI的数据报过滤原理与实现》,很是不错。文章中提到的基于SPI的数据报拦截技术是在用户级的。用户级的拦截有其优势,实现方便、便于移植、通用性强,但是,用户级并不能得到所有的数据报。本文提到的基于IMD的数据报过滤则是属于内核级的,它建立在网络驱动上面。
    其实两个月前就想写这篇文章了,可惜这个技术是我一年前做的,好久不用,已经忘的差不多了,所以一直没有写。不过,近来正巧有个课题,牵扯到了中间层驱动。于是,重新拾起丢了有一年的DDK,啃了起来。这期间,真的要非常感谢linxder的帮忙,让我少走了一些弯路,否则,我真的要从头学起了。废话不多说了,切入正题。
    


二、中间层驱动技术介绍

    中间层驱动,英文为NDIS intermediate driver。

    1)内核级网络驱动介绍
        Microsoft Windows 2000支持三种基本的内核级网络驱动,这三层driver顺序从下到上依次为:
        1. Miniport NIC drivers:微端口网卡驱动,位于最底层,直接操纵网卡并且对高层驱动提供接口。
        2. Intermediate drivers:IMD中间层驱动,这就是今天的主角,位于1和3之间,具体的作用下面就会介绍。
        3. Protocol drivers:高层协议驱动,俗称为TDI(传输驱动程序接口),高于前面两层,直接面向用户级,
                     为用户提供网络服务,也就是绝大多数程序所用到的网络接口。

    
    2)IMD驱动            
    IMD中间层,它的实质很简单,最经典的描述莫过于下面的话:
    
    An intermediate driver is typically layered over one or more NDIS NIC drivers and under a transport driver (possibly multilayered) that supports TDI at its upper edge.
    An NDIS intermediate driver exports MiniportXxx functions at its upper edge and ProtocolXxx functions at its lower edge.(见DDK文档)
    
    中间层插入网卡和协议层之间,对上面的协议层表现为一个虚拟的微端口网卡结构,而对下面的网卡则表现为一个协议层的结构。所以,无论是网卡接收并上传的数据报,还是上层要下送至网卡发送的数据报,无一例外地要经过中间层。
    

    3)IMD包过滤技术
    前面我们已经看到,所有的数据报都要经过中间层,所以,我们可以在中间层加入我们想要过滤的数据报的特征,实现基于中间层驱动的内核级包过滤。
    
    这样做的优势非常明显,首先,在驱动级别上做过滤,无须组包,速度快,效率自然就高;其次,所有的数据报无一例外,只要网卡上传的数据报均可以截获,避免了用户级无法得到所有数据报的缺点。当然,世界上没有完美的事情。IMD包过滤技术也存在其不可避免的缺点,与操作系统版本关系密切,与硬件联系大,可移植性低。我在调试这个驱动的时候,就碰到了无数次蓝屏,无数次重启动,进了几次安全模式,甚至还为此重新安装了一次系统。

上一页 下一页


 
 
标签: 过滤防火墙 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站