基于NDIS-HOOK的个人防水墙设计

2012-01-29 07:19李正生
电子设计工程 2012年12期
关键词:链表驱动程序调用

张 民,李正生,吴 宁,谭 莹

(1.第二炮兵工程大学一系,陕西 西安 710025;2.中国人民解放军96623部队 江西 上饶 334000)

随着计算机技术的发展和互联网应用技术的日益普及,人类社会正步入信息化时代。网络这把双刃剑在带给人们方便的同时,也对信息安全带来了挑战。近年来,网络失、泄密事件频发。重要国家、军事秘密的泄露、重要商业信息的丢失和个人隐私的曝光等安全问题,给国家、军队、企业和个人造成不可挽回的损失。如何解决网络失、泄密的问题,成了摆在我们面前的一个十分棘手的问题。

1 个人防水墙

防水墙是从防火墙的概念中演变出来的,防火墙是防止外部威胁向内部延伸,而防水墙技术是防止信息从内部向外部扩散。防水墙系统的设计理念是保护用户的敏感信息不被非法外传、防止泄密事件发生,从而保证内部的安全[1]。

防水墙按照应用来讲可以分为企业级和个人防水墙2种,个人防水墙应用于规模较小的个人计算机。文中所设计的就是应用于个人计算机的个人防水墙,其数据包处理过程如图1所示,当本地计算机向外发送数据时,仅对本机发送的HTTP请求的数据包进行发送,而阻止其他数据包的向外发送,从而达到防止计算机内部资料通过HTTP协议向外泄露的目的。

图1 数据包处理流程图Fig.1 Data packet processing flow chart

文中所设计的个人防水墙的核心技术是对数据包的截获、分析和处理技术。Windows操作系统下的数据包拦截技术从拦截分层上来说可以分为用户级和内核级两类,在用户层有Windows2000SPI等,在内核层主要包括TDI过滤驱动程序,NDIS中间层过滤驱动程序,NDIS-HOOK驱动程序等。其中NDIS-HOOK技术以其编程方便,接口简单,思路明确,性能稳定,灵活度更高,功能强大,安全性高,安装简单等特点为大家所广泛使用。

2 NDIS简介

NDIS(network driver interface specification)是 microsoft和3Com公司开发的网络驱动程序接口规范[2]。NDIS横跨传输层、网络层和数据链路层,为传输层提供标准的网络接口,所有的传输层驱动程序都需要调用NDIS接口来访问网络,如图2所示。在Windows下编写网络驱动程序时,利用NDIS规范只要调用NDIS函数而不用考虑其他接口问题,为网络驱动的开发提供了简便的方法。

图2 NDIS拓扑结构Fig.2 NDIS topology

NDIS支持编写3种类型的驱动程序:Miniport驱动程序、中间驱动程序和Protocol驱动程序。其结构[3]如图3所示,Miniport驱动程序可以通过DNIS接口可以完成对网卡的操作,同时也可以被上层的驱动程序调用,来实现对网卡的操作。中间驱动程序在Miniport驱动程序和Protocol驱动程序之间,在其上下两端分别具有一个Miniport驱动接口和一个Protocol驱动接口,上方的Miniport驱动接口与上层的Protocol驱动接口连接,下方的Protocol驱动接口与下层的Miniport驱动接口连接,相当于在Miniport驱动程序和Protocol驱动程序之间加了一个过渡层。Protocol驱动程序与Miniport驱动程序连接,可供底层驱动程序调用[3]。

图3 NDIS中间驱动程序拓扑结构Fig.3 NDIS intermediate driver topology

3 NDIS数据包发送流程

NDIS的数据包处理过程当上层驱动请求发送数据包时,调用Ndis send/Ndis Send Packets函数,请求NDIS发送数据包,NDIS则调用NDIS中间层驱动的Miniport Send/Miniport Send Packets,NDIS中间层驱动再调用 Ndis Send/Ndis Send Packets请求底层发送数据包,底层Miniport Send/Miniport Send Packets通过NDIS接口控制物理网络设备,将数据发送出去。NDIS数据包发送流程图如图4所示。

图4 NDIS数据包发送流程图Fig.4 NDIS send the packet flow

在上层请求发送数据包时,上层的驱动分配了相应的内存空间,当完成数据包的发送之后,系统应该及时的释放其分配的内存空间,所以,在上层调用Ndis Send/Ndis Send Packets后,返回是除NDIS_STATUS_PENDING以外的任何值时,上层驱动就可以释放资源。因为如果得到返回的结果是NDIS_STATUS_PENDING的话,说明下层驱动还没有完成发送请求,等下层驱动最终完成发送请求时,下层驱动将调用Ndis MSend Complete请求NDIS通知上层可以释放资源。然后系统调用上层驱动注册的Protocol Send Complete函数,释放内存资源。

4 NDIS-HOOK技术

NDIS-HOOK的重点是如何获得特定协议对应NDIS_PROTOCOL_BLOCK指针,获得了该指针,接下来就可以替换该协议所注册的收发函数,而达到拦截网络数据的目的。

4.1 HOOK技术实现的方法

在WindowsNT/2000下实现Hook目前主要有两种不同的思路[5]:

1)修改 NDIS.SYS的 Export Table。在 WindowsNT/2000下,可执行文件都符合 PE(Portable Executable)格式,所有向其它操作系统提供接口的驱动程序都有Export Table,因此只要修改NDIS.SYS所提供的 NDIS Register Protocol、NDIS DeRegister Protocol、NDIS Open Adapter、NDIS Close Adapter和NDIS Send函数的起始地址,就能实现对NDIS API的挂接。

2)注册假协议(Bogus Protocol)。NDIS 调用 Ndis Register Protocol(),向系统注册一个协议并将该协议作为一个链表节点插入到“协议链表”的头部,最后返回该链表头的地址。我们可以通过调用Ndis Register Protocol()向系统注册一个新的协议,就能轻易地得到“协议链表”的首地址,通过访问这个链表,就能修改其中关键函数的地址。通过调用Ndis Register Protocol()中的结构头指针可以遍历所有NDIS_OPEN_BLOCK。一般需要挂钩的函数主要在NDIS_OPEN_BLOCK中。

目前注册假协议的方法应用比较广泛,文中采用了这种方法。

4.2 NDIS-HOOK数据发送的重要函数

在发送数据包的时候,系统调用Ndis Send[6]函数

其中OUT PNDIS_STATUS Status返回函数调用结果。IN NDIS_HANDLE Ndis Binding Handle是由Ndis Open Adapter返回的识别目标网卡或虚拟设备的句柄,其实质就是目标网卡或者虚拟设备的NDIS_OPEN_BLOCK指针。IN PNDIS_PACKET Packet指向需要发送的数据包。调用Ndis Send函数,系统会把数据包通过IN NDIS_HANDLE Ndis Binding Handle指向的NDIS_OPEN_BLOCK结构中记录的Protocol Send函数发送。

4.3 NDIS-HOOK发送数据包的流程

用注册假协议法发送特定数据包的步骤,如图5所示。

图5 NDIS-HOOK发送数据包的流程Fig.5 NDIS-HOOK send the packet flow

大致可以分为以下3步:

1)调用Register Bogus NDIS Protocol函数,注册假协议获得指针;

2)调用 Hook Existing NDIS Protocols函数,遍历链表,完成程序挂钩;

3)最后调用NDIS Send Handler发送数据,完成数据的处理和发送。

所以在防水墙系统的设计中只要对防水墙的数据包处理程序进行挂钩处理,即可实现在Windows系统下对数据包的处理,实现防水墙的功能,达到防止非法数据传输的目的。

5 结束语

文中简要的介绍了防水墙技术,对NDIS-HOOK技术进行了详细的研究,根据防水墙的特点着重研究了运用HDISHOOK的数据包发送拦截技术。设想了在Windows系统下的个人防水墙系统中运用HDIS-HOOK数据包过滤技术的方法。本文研究内容有着广泛的应用前景。

[1]陈尚义.“内鬼”克星:中软防水墙Waterbox[J].信息安全与通信保密,2010(1):48-49.CHEN SHANG-yi. “Ghost”nemesis:waterwall of Chinasoft Waterbox[J].Information Security and Communications Privacy,2010(1):48-49.

[2]朱雁辉.Window防火墙与网络封包截获技术 [M].北京:电子工业出版社,2002.

[3]高泽胜,陶宏才.基于NDIS-HOOK技术的个人防火墙的研究与实现[J].成都信息工程学院学报,2004(19):327-331.GAO Ze-sheng,TAO Hong-cai.Research and implementation of personal firewall based on NDIS-HOOK[J].Journal of Chendu University of Information Technology,2004(19):327-331.

[4]Microsoft Windows 2000Driver Development Kit[S].Microsoft Press,2001.

[5]刘静,裘国永.NDIS-HOOK网络封包截获技术实现[J].微处理机,2008(5):51-56.LIU Jing,QIU Guo-yong.The implementation of network packets capturing technology based on NDIS-HOOK[J].Micro Processors,2008(5):51-56.

[6]李智鹏,李舟军,忽朝俭,等.基于NDIS-HOOK的网络数据包拦截和发送技术研究[J].计算机安全,2010(1):5-8.LI Zhi-peng,LI Zhou-jun,HU Chao-jian,et al.Research technology of network packet intercepting and sending based on NDIS-HOOK[J].Computer Security,2010(1):5-8.

猜你喜欢
链表驱动程序调用
核电项目物项调用管理的应用研究
基于二进制链表的粗糙集属性约简
跟麦咭学编程
LabWindows/CVI下基于ActiveX技术的Excel调用
计算机硬件设备驱动程序分析
基于链表多分支路径树的云存储数据完整性验证机制
基于系统调用的恶意软件检测技术研究
链表方式集中器抄表的设计
基于MPC8280的CPU单元与内部总线驱动程序设计
利用RFC技术实现SAP系统接口通信