最早出现的网络驱动应该是网卡驱动,这是Windows的下进行网络安全攻防常见的需求,为了进一步分割应用程序的网络数据传输与下层协议直到下层硬件的关系,又出现了协议驱动,后来微软和硬件商联合制定了NDIS标准,作为从硬件到协议的内核驱动程序的调用接口标准,而协议驱动与应用层的API之间,则出现了TDI接口,即从上到下的关系是
应用层API -> TDI -> 协议驱动 -> NDIS -> 下层硬件
Windows NT支持三种类型的驱动:
自上而下的关系为:
网络接口卡驱动(NIC)
NIC驱动管理网络接口卡(NIC)。NIC驱动接口在下边界直接控制硬件(NIC),在上边界提供上层驱动访问的接口:
发送和接收包
重置NIC(Reset)
停止NIC
查询NIC
设置NIC操作特性
NIC驱动的两种类型
微端口驱动:微端口驱动应用于管理NIC硬件特殊操作,包括在NIC上发送和接收数据。微端口驱动不能直接呼叫系统例程,只能呼叫NDIS提供的函数。
完全NIC驱动:完全NIC驱动不仅管理硬件而且管理NDIS完成的的操作系统特定任务。完全NIC驱动必须保持接收数据的绑定信息。
中间协议驱动
中间协议驱动是指位于上层协议驱动和微端口驱动之间的接口。
中间协议驱动接口位于上层协议驱动和微端口驱动之间。对于上层传输驱动程序来说,中间驱动看起来像是微端口驱动。对微端口驱动来说,看起来像是协议驱动。使用中间协议驱动的主要是为了传输媒质,存在于对于传输驱动未知和微端口管理之间的新的媒质类型。
协议驱动程序和NDIS进行通讯来发送和接收网络数据包,并绑定和使用低层微端口 NIC驱动程序或中间层NDIS驱动程序
1. NDIS协议驱动程序可能在上边界支持TDI,或者可以通过驱动程序的传送栈,其中包括栈顶支持TDI的栈,向高层核心模式驱动程序导出私有接口。例如,NDIS协议驱动程序可能是多模块传输实现的标准协议的最低层模块,如最高层模块支持TDI的TCP/IP协议
2. 低层NDIS驱动程序通信来发送和接收数据包的协议驱动程序总是使用NDIS提供的函数来进行通信。例如,下边界面向无连接的协议驱动程序(和面向无连接介质的低层驱动程序进行通信,如以太网、令牌环网)必须调用NdisSend或者NdisSendPackets向低层NDIS驱动程序发送数据包,也必须调用NdisRequest来产生或传送查询,以及用网络相关的低层面向无连接驱动程序支持的OID_XXX的设置信息请求
3. NDIS也提供一组隐藏低层操作系统细节的NdisXxx函数。例如,协议驱动程序调用NdisInitializeEvent为同步目的创建事件,调用NdisInitializeListHead创建链表。使用那些函数的NDIS版本的协议驱动程序在支持WIN32接口的微软操作系统中可移植性更好。协议驱动程序也可调用OS专用的核心模式支持的例程,像用KeInitializeEvent创建事件、用KeWaitForSingleObject同步两个执行线程
上层协议驱动
上层协议驱动是指应用于TDI接口或其它向用户提供服务的特定应用接口。
例如驱动调用NDIS分配包,向包中拷贝数据和向底层发送包。它也在它的底层提供协议接口,来接收下层驱动发送来的包。
TDI(Transport Driver Interface 传输层接口)仅在windows 2000~windows vista被支持,取代TDI的新技术被称为WFP(Windows Filtering Platform windows过滤平台)
我们在用户态使用socket进行socket创建、发送、接收数据,通过TDI接口连接NDIS协议驱动,TDI实际上是一套接口的集合,这套接口连接着socket和NDIS协议驱动
TDI协议驱动生成了一个有名设备,这个设备能接收一组请求
我们知道,windows内核和核心概念就是设备栈,既然NDIS协议驱动也生成了设备,我们就可以生成新的过滤设备来绑定这些设备,这样,从应用层发来的请求首先会被过滤设备截获,很多防火墙显示某个应用程序要建立某个连接、打开了某个端口,就是用这种技术实现的
TDI过滤相比于NDIS中间层过滤的一大优势就是TDI离应用层比较近,容易得到应用层的相关信息,例如一个连接的建立时可以获得相应进程号(这也是我们在不同层次进行Hook的时候需要进行技术架构权衡),但是同时,如果黑客想写一个木马来绕过TDI接口,可以不调用一般网络API来避免调用TDI接口,NDIS用中间层进行过滤相对底层,从应用层很难绕过
来源:CSDN
作者:forcj
链接:https://blog.csdn.net/forcj/article/details/104511518