-3037-
1引言
随着网络应用的日益频繁,越来越多的开发人员把精力转移到了如何实现防火墙、网络地址转换(NAT )、虚拟专用网络(VPN )等热门技术上,但是万变不离其宗,虽然他们目的各不相同,有一点却是一样的,那就是网络数据包的获取,只有首先得到数据包,才能进行相应的处理,本文主要介绍了在Windows 平台下获取网络数据包的3种方法。
2Windows Socket 2SPI 技术
WinSock2是Windows Sockets 的2.0版本,WinSock2遵照
Windows 开放服务架构WOSA ,
可以有效地使得第3方的服务提供者被插入到系统中而无需重新书写代码,也无需替换现有的WinSock 2DLL (Ws2_32.dll )。
WinSock 2架构如图1所示。WinSock 2API 是基于socket 的一种标准网络接口,它为上层应用程序提供透明的服务。WinSock 是以DLL 的形式实现的,SPI 也是一个标准的接口,
任何实现了这种标准接口的传输服务提供者和名字解析服务提供者都可以被系统调用。
传输服务提供者有两种类型:他们是基础服务提供者(Base Service Provider )和分层服务提供者(Layered Service Pro-vider )。在处理过程中,
系统会首先调用最上层的分层服务提供者,然后由此提供者决定下一个调用者,最后被调用的是基础服务提供者。
传输服务提供者作为一个标准的Windows 平台下的dll ,它向外只有一个引出函数------WSPStartup 。该函数有一个输入参数LPWSAPRTOCOL_INFOW 结构指针,正是由于这个参数说明了服务提供者的类型,除此之外,根据SPI 规范,服务提供者还提供了30个传输服务函数供应用程序使用,他们是以函数表的方式存在的,即在一个表格中存储30个服务函数的地址。他们是传输服务提供者的内部函数,对外不公开,系统只能根据输出参数LPWSPPROC_TABLE 得到他们的地址。当网络应用程序调用WSASocket/socket 函数创建套接字时,会有3个参数:
地址族、套接字类型和协议,正是这3个参数共同决定了是由哪一个类型的传输服务提供者来实现本应用程序的功能。Ws2_32.dll 使用标准的动态链接库来加载相应服务提供者接口的DLL 到系统中去,并调用WSPStartup 来初始化。在整个层次结构中,Ws2_32.dll 只是起到了“中间人”的作用,本身并没有实现什么功能,而真正实现网络传输功能的就是传输服务提供者接口,应用程序则是对用户功能的实现。
此外,为了方便用户,当前系统中有一些默认的服务提供者,它们已
收稿日期:2004-10-12。
作者简介:胡滨(1980-),男,江苏徐州人,硕士,助教,研究方向为计算机网络管理和安全。
基于Windows 平台的底层网络数据包捕获技术
胡
滨
(南京农业大学信息科技学院,江苏南京210095)
摘
要:无论是实现防火墙,NAT 还是VPN,首要的任务就是获得网络上传输的数据包,在此基础上才能进行下一步的工作。通过分析Windows 的网络数据传输机制,可以定位出不同的处理关键点,从而在不同的层次上实现数据包的捕获功能,以满足不同的需要。
关键词:关键点;服务提供者接口;网络设备接口规范;中间层驱动程序;钩子驱动程序中图法分类号:
TP393
文献标识码:A
文章编号:1000-7024(2005)11-3037-02
Technology of capturing network packets based on Windows platform
HU Bin
(College of Information Science and Technology,Nanjing Agricultural University,Nanjing 210095,China )
Abstract :No matter what do you want to implement,firewall,NAT or VPN,the funermental task is to get the network packets .By the means of studying mechanism of Windows network packets transmission,researchers can locate different key points to implement packets capture function and to satisfy different demands.
Key words :key points;Winsock 2SPI;NDIS;IM driver;NDIS-hook driver
2005年11月计算机工程与设计
Nov.2005
第26卷第11期Vol.26
No.11
Computer Engineering and Design
图1WinSock2架构
Winsock2API
WS2_32.DLL
SPI
Trans port Layered_protocol
SPI
Base Protocol
NAME SPACE
-3038-
经替我们实现了大部分最基本的功能。所以我们在编写自己的服务提供者程序时,只须对数据报进行“修饰”后,再将数据报传送给系统服务提供者来实现剩下的功能即可。
3NDIS 中间层驱动
如图2所示,TCP/IP 通信系统结构可以分为大的3个层次:通信应用层、协议层、驱动层。通信应用层就是如浏览器、收发程序、QQ 聊天器等上网工具,调用Socket 进行通信编程,运行在操作系统的用户模式下;协议层就是TCP/IP 的通信数据的发送、接收、处理等实际通信功能的实现,工作在操作系统的核心模式下;驱动层是完成TCP/IP 通信数据在通信物理硬件(如网卡)上的发送和接收功能的实现,也工作在操作系统的核心模式下,但层次更低,优先级别更高,直接和物理硬件打交道。在Win2000中,驱动程序具有一套标准的编程接口规则,称为NDIS ,习惯上就把这一层的底层通信驱动程序称为NDIS 驱动程序。NDIS 是Network Driver Interface Specification 的缩写,中文意思是网络驱动程序接口规范。NDIS 为传输层提供标准的网络接口,所有的传输层驱动程序都要调用NDIS 接口来访问网络。
NDIS 支持编写3种类型的驱动程序:Miniport 驱动程序、中间驱动程序、Protocol 驱动程序。
Miniport 驱动程序可以通过NDIS 接口来完成对网卡的操作,同时开放Miniport 接口供上层驱动调用。中间层驱动位于Miniport 驱动和Protocol 驱动之间,
同时具有Miniport 和proto-col 驱动程序接口。Protocol 驱动程序开放Protocol 接口供底层驱动程序调用,用来实现协议驱动。有中间驱动与无中间驱动的对比结构示意图如图3所示。
由图3可以看出,中间层插入网卡和协议层之间,对上面的协议层表现为一个虚拟的微端口网卡结构,对下面的网卡则表现为一个协议层的结构,所以无论是网卡接收并上传的数据包,还是上层下送至网卡发送的数据包,都无一例外地要经过中间层。
利用NDIS 中间驱动可以在网卡驱动和传输驱动程序之
间插入自己的一层处理,可以很轻易地截获网络封包并重新进行封包、加密、网络地址转换及过滤等操作。由于NDIS 中间驱动程序可以能够截获所有的网络数据包,而且工作在核心模式下,所以无需组包,速度自然很快,虽然它编程接口相当复杂,安装也很麻烦,但是与使用NDIS 中间层驱动实现出来的强大功能以及高安全系数相比,这些缺点是可以忍受的。NDIS 中间层驱动是微软的推荐使用技术,其应用非常广泛,可以用来实现VPN 、NAT 、PPPOverEthernet 、VLAN 以及个人防火墙等。
4
NDIS Hook Driver
在Win9x 与Wind2000/NT 下实现hook 的方法是不同的,
鉴于如今Win2000/NT 更为流行,在此主要介绍一下在2000平台下实现hook 的两种不同的思路。
4.1通过修改NDIS.SYS 的Export Table
在Windows NT/2000下,可执行文件(包括DLL 以及SYS )
都是遵从PE (Portable Executable )格式的。而所有的驱动都是后缀名为sys 的文件,因此驱动程序都有Export Table ,只要修改NDIS.SYS 的Export Table 就可实现对关键NDIS API 的挂接。由于协议驱动程序在系统启动的时候会调用NdisRegister Protocol 来向系统进行协议注册,
因此这种方法关键在于修改NDIS.SYS 所提供的NdisRegisterProtocol/NdisDeRegisterPro-tocol/NdisOpenAdapter/NdisCloseAdapter/NdisSend 函数的起始地址。由于Windows 区分了用户态和核心态,在用户态下要修改PE 文件格式可以很容易的用一些API 来实现,而NDIS.SYS 位于系统的核心内存区,
因此要修改NDIS.SYS 就只有通过写驱动程序来实现,也就要求我们对PE 文件格式有比较深入的了解。
使用这种方法还要注意驱动程序的加载次序,显然Hook Driver 必须在NDIS.SYS 被加载之后,而在协议驱动程序如tcpip.sys 被加载之前,另外,Windows2000还提供了系统文件保护机制,因此在修改ndis.sys 还需要通过修改注册表屏蔽系统文件保护机制。
4.2向系统注册假协议(fake protocol )
在Windows 内核中,所有已注册的协议是通过一个单向
的协议链表来维护的,这个单向链表保存了所有已注册协议的NDIS_PROTOCOL_BLOCK 结构的地址,在这个结构中保存了协议驱动所指定的派发函数的地址如RECEIVE_HANDLER 等,并且,每个协议驱动还维护一个NDIS_OPEN_BLOCK 的单向链表来维护0000000其所绑定的网卡信息。当协议驱动调用NdisRegisterProtocol 之后,NDIS 总是会把新注册的协议放在协议链表的表头并返回这张表,所以只要我们注册一个新的协议通过新协议注册返回的链表头就可以轻而易举的遍历系统中所有协议表。但是,如果要成功地挂接派发函数,还需
图2
TCP/IP 通信系统结构
物理硬件(网卡等)
NDIS 驱动
浏览器
邮件收发器
用户模式
核心模式
核心模式应用层
协议层
驱动层
Socket
TCP IP
(下转第3081页)
况下都优于文献[1]所提的算法。但本文算法所估计的值误差没有像文献[1]算法那样,随着噪声的减少而减小。
实验2多通道图像恢复
(1)没有加入小波融合与加入小波融合的比较
图4中横坐标是迭代次数,纵坐标是均方误差,
即
=
1
,
,从上图可以看出在迭代过程中加入小波
融合从收敛速度和恢复结果上都有明显的优势。
(2)本文算法与文献[1]中算法恢复结果的比较
采用'lena'图与散焦半径分别是5~24模糊算子卷积得到20幅测试图。图5中(a)是原图,(b)是20幅测试图中最清楚的一幅,(c)是采用本文算法恢复的结果,(d)是文献[1]文提出的算法恢复的结果,这两个结果的输入序列是20幅图,(e)是散焦半径是20-24的5幅图,采用本文算法恢复的结果,(f)是采用文献[1]文中所提算法恢复的结果。(c)、(d)、(e)和(f)
的
R,Fl
usserJ
afrnkovJ.Weekofdoctoralstu-dents1999[C].Praha:MatfyzPress,1999.
[4]WilliamH.PressnumericalrecipesinC[M],Cambridge:Cam-bridge University Press,1992.
[5]Deepa Kundur,Dimitrios Hatzinakos.Blind image deconvolution
[J].IEEE Signal Processing Magazine,1996,13(3):43-64. [6]Ramesh Neelamani.Inverse problem in image processing[D].
Texas:Rice University,2003.
[7]Mallat S,Zhong S.Characterization of signals from multiscale
edges[J].IEEE Trans Pattern Anal Machine Intell1992,(14): 710-732.socket通信在哪一层
[8]Mallat S,Hwang W.Singularity detection and processing with
wavelets[J].IEEE Trans Inform Theory,1992,38:617-643. [9]Scheunders P.Multiscale edge representation applied to image
fusion.proc Wavelet applications in signal and image processing VIII[C].San Diego:SPIE,2000.
[10]Zhang Z,Blum R.A categorization of multiscale-decomposition-
based image fusion schemes with a performance study for a di-gital camera application[J].Proc IEEE,1999,87(8):1315-1325.
[11]Paul R.Hill cedric nishan canagarajah david R.Bull.Image fus-
ion using complex wavelets[A].Paul L,Rosin A,David marshall.
BMVC2002[C].Cardiff,2002.
[12]Donoho D L.De-noising by soft-thresholding[J].IEEE Trans In-
form Theory,1995,41(3):613-627.
[13]Hillery A D,Chin R T.Iterative wiener filters for image restora-
tion[J].IEEE Trans Signal Processing,1991,39(8):1892-1899.
要对协议所对应的NDIS_OPEN_BLOCK结构里的派发函数进行挂接,因为NDIS并不是直接调用协议驱动在NDIS_PRO-TOCOL_CHARACTERISTICS所注册的派发函数地址,而是调用NDIS_OPEN_BLOCK里的派发函数。值得注意的是:在Windows9x/Me/NT的DDK中,NDIS_PROTOCOL_BLOCK的定义是很明确的,而在Windows2000/xp的DDK中,并没有该结构的详细定义,也就是说该结构在Windows2000/xp下是非公开的,因此开发人员需要利用各种调试工具来发掘该结构的详细定义。也正是因为如此,这种方法对平台的依赖性比较大,需要在程序中判断不同的操作系统版本而使用不同的结构定义。通过用自己的处理代替系统的处理,我们就可以放心地对底层的数据包进行各种操作,这也是在Windows平台下网络数据包获取的一种非常流行的方法。
5结论
本文全面介绍了在Windows平台下捕获网络数据包的方法,并且对他们的工作原理和机制进行了比较深入的分析:Windows SPI工作原理比较简单,实现起来也比较容易,但是只能抓取调用socket程序的数据包;NDIS IM和NDIS_Hook原理比较复杂,实现起来也比SPI困难的多,但是可以获取所有进出本机的数据包,功能相当强大。开发人员可以根据自己的需要选用不同的技术。
参考文献:
[1]朱雁辉.Windows防火墙与网络封包截获技术[M].北京:电子
工业出版社,2002.
[2]胡滨,贺超凯,左明.Windows下使用SPI过滤网络数据包—
CERNET2003学术年会论文集[C].武汉:华中科技大学出版社,2003.172-174.
[3]苍志刚,潘爱民.Windows平台下的网络监听技术[J].计算机
工程与设计,2004,25(2).248-252.
[4]Leng.Windows下的个人防火墙-网络数据包拦截技术概览.
[EB/OL].www.fengnet/showart.asp?art_id=234& cat_id=11.
[5]庄春兴,刘渊.两种数据包捕获架构的分析与比较[J].计算机应
用与软件,2002,19(10).63-64.
[6]殷肖川,刘志宏,姬伟锋,等.网络编程与开发技术[M].西安:西安
交通大学出版社,2003.
(上接第3038页)
-3081-
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论