NDIS HOOK和WinSock2 SPI技术原理

更新时间:2024-04-18 18:17:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

NDIS HOOK和WinSock2 SPI技术原理

NDIS HOOK技术原理

NDIS是微软和3COM共同提出来的网络驱动程序开发技术,NDIS HOOK是NDIS体系中技术最复杂,但功能最强大的一种子技术[32]。

NDIS HOOK技术原理:在Windows网络体系中,所有的数据接收和发送,网卡状态的设置与查询都经过了NDIS,无论是协议驱动程序,中间层驱动程序,还是微端口驱动程序它们都是直接调用NDIS相应的库函数。通过挂接这些NDIS库函数将所有这些收发数据途径截获,从而获得所有网络数据封包,然后我们可以对网络封包的内容进出处理包括解析、过滤、安全认证、加密等后再转发处出去。

在实际上,我们并不需要挂接所有的库函数,只需要钩挂少许的几个函数即可,如NdisRegisterProtocol和NdisOpenAdater。采用NDIS挂接库函数的方法来实现数据的截获是一种较高级、非常规的做法,需要对系统比较熟悉,并且对PE格式和NDIS的操作流程也要有一定的了解[33]。NDIS HOOK在协议栈中结构如图1所示。

TCP/IP Other Protocals NDIS HOOK Intermediate driver Miniport driver NetCard

图1 NDIS协议栈的结构图

Fig.1 Structure Chart of NDIS Protocol Stack

WinSock2 SPI技术原理

网络编程规范Windows Sockets是在Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。从1991年的1.0版到最新的2.2版,经过不断完善并且在Intel、 Microsoft、 Sun、 SGI、 Informix、 Novell等公司的全力支持下,己成为Windows网络编程的事实上的标准[34]。它不仅包含了具有Berkeley Socket风格的库函数,也包含了一组针对Windows的扩展库函数,使程序员能充分地利用Windows消息驱动机制进行编程。

Windows Socket规范提供给应用程序开发者一套简单的API,任何能够与Windows Sockets兼容实现协同工作的应用程序就被认为具有Windows Sockets接口。Windows Socket规范定义并记录了如何使用API与Internet协议族(IPS,通常指的是TCP/IP)连接。应用程序调用WinSock的API实现相互之间的通信,WinSock利用下层的网络通信协议功能和操作系统调用实现实际的通信工作,它们之间的关系如图2所示。

Process1 Process2

TCP/IP协议栈 WinSock API OS(Windows,Unix) 物理通讯介质

图2 WinSock体系结构 Fig. 2 WinSock Architecture

WinSock2是Windows Sockets的2.0版本,该版本引入了一种新的叫做SPI的编程接口。利用这种技术开放出标准的接口函数供程序员在服务提供者中间插入一层,从而完成诸如传输质量控制(Qos)、扩展TCP/IP协议栈、URL过滤及网络安全控制等功能。WinSock 2是一个接口,而不是协议,所以它可以用于发现和使用任意数量的底层传输协议所提供的通信能力。

WinSock2的传输服务提供者是以动态链接库形式(DLL)存在的,通过WSPStartup函数为上层函数提供接口,而其他的传输服务提供者函数则是通过分配表的方式来访问WS2_32.dll。传输服务提供者的动态链接库只有在应用程序需要时才由Ws2_32.dll来装入内存中的,在不需要时会被自动卸载。WinSock 2提供的服务提供者者的结构如图3所示。

Winsock2应用程序

Winsock2应用程序 Winsock API接口 传输函数 名字空间函数 TransportFunctions Name Space Function WS2_32.DLL

Winsock2传输服务提供者接口 Winsock2名字空间服务提供者接口

传输 服务提供者 服务提供者

传输 名字空间 服务提供者 名字空间 服务提供者 图3 WinSock2 SPI结构 Fig.3 WinSock2 SPI Structure

传输服务提供者实现的功能包括建立连接,传输数据,实现流控制和差错控制等函数。不仅要正确的安装服务提供者,还必须在Windows Socket中注册,将相关的系统信息保存在数据库中,这样Ws2_32.dll才能够获得下层服务提供者的相关信息。在Ws2_32.dll中提供了用来安装服务提供者的函数,它需要服务提供者的有关数据,例如DLL的名称和路径。同时Ws2_32.dll还提供了卸载服务提供者的函数SCDeinstallProvider,在不需要时通过它将特定的服务提供者从系统中删除。

本文来源:https://www.bwwdw.com/article/r1dp.html

Top