(2) NDIS中间层驱动。该方法是本课题所采用的包过滤的方法。NDIS中间层驱动处于协议层驱动之下,小端口驱动之上,对所有通过的数据包进行过滤。
(3) Windows 2000 过滤钩子驱动(Win2K Filter-Hook Dirver)。该方法是Windows 2000所提供的,其就结构简单,容易实现,能够截获所有的IP数据包,但是太过依赖ipfiltdrv.sys。
(4) NDIS钩子驱动(NDIS Hook Driver)。这种方法主要就是利用Hook技术,来替换NDIS导出的函数,从而实现数据包的截获。该方法能偶截获所有的IP包,且安全性也较好。
1.2.4 NDIS驱动模型
NDIS即网络驱动程序接口规范。其实现了设备的无关性,屏蔽了具体物理设备的差异,从而实现上层驱动与底层网卡的通信。NDIS定义了操作系统网络传输模块的抽象环境,分离了网络驱动程序和其与操作系统的通讯。NDIS主要包括三种驱动程序:小端口驱动程序(Miniport),中间驱动程序(IMD)以及协议驱动程序(protocol)。
(1) 小端口驱动程序
小端口驱动其实就是网卡驱动。它通过NDIS接口从网卡接受到的数据传递到上层驱动程序,并通过IO和中断资源将上层要发送的数据包发给网卡。
(2) 协议驱动程序
协议驱动程序接受用户的Socket请求,将数据封装成以太网帧发送出去。另外如果接受到以太网帧,则解析用户数据并上传到应用程序。
(3) 中间驱动程序
中间层驱动程序主要是结合了协议驱动和小端口驱动的功能。其位于协议驱动程序和小端口驱动程序之间,实现协议转换。它扮演两种角色,向上提供小端口韩书记,向下提供协议函数集。另外,中间层驱动程序是可以叠加的。所有协议层驱动和小端口驱动之间的交互活动都必须经过中间层驱动,这样就可以对通过的数据进行捕获和处理,从而实现数据包过滤的功能。
1.2.5 Windows驱动开发简介
Windows驱动程序一种特殊程序类型,它处于内核地址空间,并且工作在内核模式下。其文件后缀名为sys。编写驱动主要需要DDK(Device Development Kit)或者WDK(Windows Driver Kit)。WDK是DDK的升级版,他们所对应的操作系统版本不同,所以开发不同版本的操作系统驱动时,要注意选用对应的版本。另外还需要一款调试工具WinDbg来配合在虚拟机中进行调试。
驱动开发主要需要注意一下几个问题:
(1) 函数的多线程安全性
函数多线程安全性是指当函数在被调用过程中,又被其他线程调用的情况下,函数执行结果的可靠性。下面是内核编程中主要调用源的运行环境,如表1-1所示。
表1.1 内核编程中主要调用源的运行环境
调用源 运行环境 原因
DriverEntr,DriverUnload 单线程 系统进程的单一线程调用
各种分发函数 多线程 无法保证分发函数不会被多线程调用
完成函数 多线程 随时可能被未知的函数调用
各种NDIS回调函数 多线程 随时可能被未知的函数调用
(2) 代码的中端级
中断级主要有两种:Passive和Dispatch。其中Dispatch的级别较高。下面的表格列出了内核代码主要调用源的运行中断级别。
表1.2 内核代码主要调用源的运行中断级别
调用源 运行中断级
DriverEntry,DriverUnload Passive
各种分发函数 Passive 包过滤防火墙的编程实现(3):http://www.751com.cn/jisuanji/lunwen_15847.html