NDIS截获数据包学习笔记(一)

来源:互联网 发布:vscode md预览快捷键 编辑:程序博客网 时间:2024/05/16 11:38

网络驱动程序接口规范(NDIS)是微软为网络接口卡(NIC)的局域网驱动程序提供的一种标准应用程序接口(API)。NDIS 适用于服务器或工作站。NDIS 标准支持计算机通过不同的通信协议与网络相连,如:TCP/IP、IPX、NetBIOS、AppleTalk 等。
  NDIS 在数据链路层(第二层)的媒体控制层(MAC)执行其功能。NIC 硬件实现过程与媒体访问控制(MAC)设备驱动程序紧密相关,这样利用通用编程接口,可以访问同一媒体(如以太网)的所有网络接口卡。其次 NDIS 还具有关于网络驱动程序硬件的功能库,主要用于 MAC 驱动和更高级的协议驱动(如 TCP/IP)。利用功能库的各种功能支持,使得 MAC 和协议驱动的开发过程变得相对简单,同时在某种程度上,掩盖了平台的依赖特性。此外通过 NDIS,也可以帮助网络驱动程序维护状态信息和参数,包括联接或其它系统值中涉及的指针功能、句柄及参数块等。

  NDIS 支持以下网络驱动类型:


小端口驱动(Miniport Driver)
中间层驱动(Intermediate Driver)
协议驱动(Protocol Driver)
 

 

Miniport driver,NDIS微端口网卡驱动,位于最底层,直接操纵网卡并且对高层驱动提供接口,也是我们常说的网卡驱动。

Intermediate drivers,NDIS中间层驱动(IMD驱动),这是界于链路层和网络层之间的驱动,这就是今天的主角,位于1和3之间。

Protocol drivers,NDIS协议驱动,高层协议驱动,俗称为TDI(传输驱动程序接口),高于前面两层,直接面向用户级,为用户提供网络服务,也就是绝大多数程序所用到的网络接口。例如TCP/IP协议驱动。

 

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文档)

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

 

总的来说,要拦截Windows下的网络数据包可以在两个层面进行:用户态(user-mode)和内核态(kernel-mode)

用户态下的网络数据包拦截

在用户态下进行网络数据包拦截有以下几种方法:

1) Winsock Layered Service Provider (LSP)。这种方法在MSDN里有很详细的文档,并且给出了一个例子(SPI.CPP)。这种方法的好处是可以获得调用Winsock的进程详细信息。这就可以用来实现QoS,数据流加密等目的。但是,如果应用程序直接通过TDI(Transport Driver Inface)调用TCPIP来发送数据包,这种方法就无能为力了。对于一些木马和病毒来说要实现通过TDI直接调用TCPIP是一件很容易的事情。因此,大多数的个人防火墙都不使用这种方法。国内也有使用该方法实现的个人防火墙,例如Xfilter(www.xfilter.com)。

2) Windows 2000 包过滤接口。Windows 2000 IPHLP API提供了安装包过滤器的功能。但是,包过滤的规则有很多限制,对于个人防火墙来说是远远不够的。

3) 替换系统自带的WINSOCK动态连接库。这种方法可以在很多文章里面找到详细的实现细节。

很显然,在用户态下进行数据包拦截最致命的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包无法进行处理。对于一些木马和病毒来说很容易避开这个层次的防火墙。

利用驱动程序拦截网络数据包

大多数的个人防火墙都是利用网络驱动程序来实现的。从图1中我们马上可以想到可以从以下几个方面来做文章:

1、TDI过滤驱动程序(TDI Filter Driver)

2、NDIS中间层驱动程序(NDIS Intermediate Driver)

3、Win2k Filter-Hook Driver

4、NDIS Hook Driver

 

TDI过滤驱动程序。当应用程序要发送或接收网络数据包的时候,都是通过与协议驱动所提供的接口来进行的。协议驱动提供了一套系统预定义的标准接口来和应用程序之间进行交互。在Windows 2000/NT下,ip,tcp,udp是在一个驱动程序里实现的,叫做tcp.sys,这个驱动程序创建了几个设备:DeviceRawIp,DeviceUdp,DeviceTcp,DeviceIp, DeviceMULTICAST。应用程序所有的网络数据操作都是通过这几个设备进行的。因此,我们只需要开发一个过滤驱动来截获这些交互的接口,就可以实现网络数据包的拦截。TDI层的网络数据拦截还可以得到操作网络数据包的进程详细信息,这也是个人防火墙的一个重要功能。

 

NDIS中间层驱动。中间层驱动介于协议层驱动和小端口驱动之间,它能够截获所有的网络数据包(如果是以太网那就是以太帧)。NDIS中间层驱动的应用很广泛,不仅仅是个人防火墙,还可以用来实现VPN,NAT,PPPOverEthernet以及VLan。中间层驱动的概念是在Window NT SP4之后才有的,因此对于Windows9x来说无法直接利用中间层驱动的功能。Windows DDK提供了两个著名的中间层驱动例子:Passthru以及Mux。开发人员可以在Passthru的基础上进行开发,Mux则实现了VLan功能。目前个人防火墙的产品还很少用到这种技术,主要的原因在于中间层驱动的安装过于复杂,尤其是在Windows NT下。Windows 2000下可以通过程序实现自动安装,但是如果驱动没有经过数字签名的话,系统会提示用户是否继续安装。中间层驱动功能强大,应该是今后个人防火墙技术的趋势所在,特别是一些附加功能的实现。

 

Win2k Filter-Hook Driver。这是从Windows2000开始系统所提供的一种驱动程序,该驱动程序主要是利用ipfiltdrv.sys所提供的功能来拦截网络数据包。Filter-Hook Driver在结构非常简单,易于实现。但是正因为其结构过于简单,并且依赖于ipfiltdrv.sys,Microsfot并不推荐使用Filter-Hook Driver。

 

NDIS Hook Driver。这是目前大多数个人防火墙所使用的方法。Hook的概念在Windows9x下非常流行,而且实现也很容易。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chief1985/archive/2008/11/24/3365252.aspx